dotnet publish include extra files

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 &quot;$(SolutionDir)Ethereum.Contracts\bin\$(ConfigurationName)\*.abi&quot; &quot;$(TargetDir)&quot; /Y /I&#xA;&#xA;&#xD;&#xA;xcopy &quot;$(SolutionDir)Ethereum.Contracts\bin\$(ConfigurationName)\*.bin&quot; &quot;$(TargetDir)&quot; /Y /I" />
  </Target>

  <Target Name="AddPayloadsFolder" AfterTargets="AfterPublish">
    <Exec Command="xcopy &quot;$(TargetDir)\*.abi&quot; &quot;$(PublishDir)&quot; /Y /I&#xA;&#xA;&#xD;&#xA;xcopy &quot;$(TargetDir)\*.bin&quot; &quot;$(PublishDir)&quot; /Y /I" />
  </Target>

</Project>
Run Code Online (Sandbox Code Playgroud)

Cod*_*ler 8

启动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 &quot;$(SolutionDir)\Ethereum.Contracts\bin\$(ConfigurationName)\*.abi&quot; &quot;$(TargetDir)&quot; /Y /I&#xA;&#xA;&#xD;&#xA;xcopy &quot;$(SolutionDir)\Ethereum.Contracts\bin\$(ConfigurationName)\*.bin&quot; &quot;$(TargetDir)&quot; /Y /I" />
</Target>
Run Code Online (Sandbox Code Playgroud)

更新(关于AddPayloadsFolder目标):

AddPayloadsFolder 目标定义为

<Target Name="AddPayloadsFolder" AfterTargets="AfterPublish">
Run Code Online (Sandbox Code Playgroud)

未执行,因为AfterTargetsfor的正确值dotnet publishPublish,不是AfterPublish。我没有找到关于这个事实的明确文档,但是在这个 issue 中提到了

还可以考虑用多个xcopy命令替换由换行符分隔的几个命令。当我AddPayloadsFolder最终执行 target 时,我收到了由\r附加到命令行的分隔符引起的错误。

总结以上所有,这里是调整PostBuildAddPayloadsFolder目标:

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

<Target Name="AddPayloadsFolder" AfterTargets="Publish">
    <Exec Command="xcopy &quot;$(TargetDir)*.abi&quot; &quot;$(PublishDir)&quot; /Y /I" />
    <Exec Command="xcopy &quot;$(TargetDir)*.bin&quot; &quot;$(PublishDir)&quot; /Y /I" />
</Target>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,作品。但我更喜欢这样:https://gist.github.com/jakubsuchybio/7efe6aa1147f088072459a39837f2ecd (7认同)