Dot-Net

dotnet publish 包含額外文件

  • October 12, 2021

我有一個 netcore 應用程序取決於我的自定義項目。因為我不能直接引用它,所以我編寫了將文件複製到輸出的 postbuildevents:

xcopy "$(SolutionDir)Ethereum.Contracts\bin\$(ConfigurationName)\*.abi" "$(TargetDir)" /Y /I
xcopy "$(SolutionDir)Ethereum.Contracts\bin\$(ConfigurationName)\*.bin" "$(TargetDir)" /Y /I

當我建構和執行項目時它工作正常,但是在執行publish命令時它不包含這些文件。

如何做呢?我也嘗試過這種方法,但AddPayloadsFolder沒有被呼叫。

我的csproj

<Project Sdk="Microsoft.NET.Sdk">

 <PropertyGroup>
   <OutputType>Exe</OutputType>
   <TargetFramework>netcoreapp2.0</TargetFramework>
 </PropertyGroup>

 <ItemGroup>
   <ProjectReference Include="..\..\Dependencies\Dependencies.csproj" />
 </ItemGroup>

 <ItemGroup>
   <None Update="appsettings.json">
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
   </None>
   <None Update="log4net.config">
     <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
   </None>
 </ItemGroup>

 <Target Name="PostBuild" AfterTargets="PostBuildEvent">
   <Exec Command="xcopy "$(SolutionDir)Ethereum.Contracts\bin\$(ConfigurationName)\*.abi" "$(TargetDir)" /Y /I


xcopy "$(SolutionDir)Ethereum.Contracts\bin\$(ConfigurationName)\*.bin" "$(TargetDir)" /Y /I" />
 </Target>

 <Target Name="AddPayloadsFolder" AfterTargets="AfterPublish">
   <Exec Command="xcopy "$(TargetDir)\*.abi" "$(PublishDir)" /Y /I


xcopy "$(TargetDir)\*.bin" "$(PublishDir)" /Y /I" />
 </Target>

</Project>

啟動dotnet publish命令時,$(SolutionDir)未定義宏。結果xcopy以不正確的源路徑啟動。

此處描述了缺少解決方案宏的問題,它仍處於打開狀態。我不確定它是否會被修復,因為$(SolutionDir)它是特定於 IDE 的宏。

要解決您的問題,您可以通過 switch將$(SolutionDir)宏的值傳遞給命令:dotnet publish``/p

dotnet publish -c Release -r win-x64 /p:SolutionDir=“D:\projects\SolutionDir”

您還應該在$(SolutionDir)宏之後添加反斜杠:

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
   <Exec Command="xcopy "$(SolutionDir)\Ethereum.Contracts\bin\$(ConfigurationName)\*.abi" "$(TargetDir)" /Y /I


xcopy "$(SolutionDir)\Ethereum.Contracts\bin\$(ConfigurationName)\*.bin" "$(TargetDir)" /Y /I" />
</Target>

更新(關於AddPayloadsFolder目標):

AddPayloadsFolder目標定義為

<Target Name="AddPayloadsFolder" AfterTargets="AfterPublish">

未執行,因為 for 的正確值為AfterTargetsis dotnet publishPublishnot AfterPublish。我還沒有找到關於這個事實的明確文件,但是在這個問題中提到了它。

還可以考慮用多個xcopy命令替換由換行符分隔的多個命令。當我最終執行目標時,我收到了一個由附加到命令行的分隔符AddPayloadsFolder引起的錯誤。\r

總結以上所有,這裡有調整PostBuildAddPayloadsFolder目標:

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
   <Exec Command="xcopy "$(SolutionDir)\Ethereum.Contracts\bin\$(ConfigurationName)\*.abi" "$(TargetDir)" /Y /I" />
   <Exec Command="xcopy "$(SolutionDir)\Ethereum.Contracts\bin\$(ConfigurationName)\*.bin" "$(TargetDir)" /Y /I" />
</Target>

<Target Name="AddPayloadsFolder" AfterTargets="Publish">
   <Exec Command="xcopy "$(TargetDir)*.abi" "$(PublishDir)" /Y /I" />
   <Exec Command="xcopy "$(TargetDir)*.bin" "$(PublishDir)" /Y /I" />
</Target>

引用自:https://stackoverflow.com/questions/49573010