Ale*_*kiy 9 .net .net-core .net-core-2.0
我有一个 netcore 应用程序取决于我的自定义项目。因为我无法直接引用它,所以我编写了将我的文件复制到输出的 postbuildevents:
xcopy "$(SolutionDir)Ethereum.Contracts\bin\$(ConfigurationName)\*.abi" "$(TargetDir)" /Y /I
xcopy "$(SolutionDir)Ethereum.Contracts\bin\$(ConfigurationName)\*.bin" "$(TargetDir)" /Y /I
Run Code Online (Sandbox Code Playgroud)
当我构建和运行项目时它工作正常,但是当运行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>
Run Code Online (Sandbox Code Playgroud)
启动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>
Run Code Online (Sandbox Code Playgroud)
更新(关于AddPayloadsFolder目标):
AddPayloadsFolder 目标定义为
<Target Name="AddPayloadsFolder" AfterTargets="AfterPublish">
Run Code Online (Sandbox Code Playgroud)
未执行,因为AfterTargetsfor的正确值dotnet publish是Publish,不是AfterPublish。我没有找到关于这个事实的明确文档,但是在这个 issue 中提到了它。
还可以考虑用多个xcopy命令替换由换行符分隔的几个命令。当我AddPayloadsFolder最终执行 target 时,我收到了由\r附加到命令行的分隔符引起的错误。
总结以上所有,这里是调整PostBuild和AddPayloadsFolder目标:
<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>
Run Code Online (Sandbox Code Playgroud)