【问题标题】:How to force copy to output directory over eveything els?如何强制复制到输出目录而不是其他所有内容?
【发布时间】:2020-02-05 20:02:28
【问题描述】:

我的.csproj 文件中有这段代码 sn-p,用于在构建后强制将特定版本的System.Runtime.CompilerServices.Unsafe.dll 复制到输出文件夹中:

  <Target Name="ForcingUnsafeSpecificVersion" AfterTargets="AfterBuild">
    <Copy SourceFiles="Path\System.Runtime.CompilerServices.Unsafe.dll" DestinationFolder="$(OutDir)" />
  </Target>

但它不起作用。它不会覆盖输出目录的版本,或者可能有其他东西覆盖它。

我也试过了:

  <ItemGroup>
    <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="4.6.0-preview.18571.3">
      <NoWarn>NU1605</NoWarn>
    </PackageReference>
  </ItemGroup>

仍然没有成功。我也试过了:

  <ItemGroup>
    <None Include="Path\System.Runtime.CompilerServices.Unsafe.dll">
      <Link>System.Runtime.CompilerServices.Unsafe.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

没用。请注意,这条线有效

  <ItemGroup>
    <None Include="Path\System.Runtime.CompilerServices.Unsafe.dll">
      <Link>System.Runtime.CompilerServices.Unsafe2.dll</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

如果我在输出文件的名称末尾添加数字 2,那么它可以工作。但似乎所有这些构建配置都失败并被其他东西覆盖。

如何强制将此文件复制到输出目录中?

【问题讨论】:

  • 嗨,这个问题有什么更新吗?

标签: visual-studio msbuild nuget csproj


【解决方案1】:

1.您似乎只是在构建后尝试将某些内容复制到 OutDir。

  <Target Name="ForcingUnsafeSpecificVersion" AfterTargets="AfterBuild">
    <Copy SourceFiles="Path\System.Runtime.CompilerServices.Unsafe.dll" DestinationFolder="$(OutDir)" />
  </Target>

如果您只需要复制一个文件,此任务应该始终有效,如果不需要,也许它可能与访问有关。您可以在命令中添加OverwriteReadOnlyFiles 选项以检查它是否有帮助:

  <Target Name="ForcingUnsafeSpecificVersion" AfterTargets="AfterBuild">
    <Copy SourceFiles="Path\System.Runtime.CompilerServices.Unsafe.dll" DestinationFolder="$(OutDir)" OverwriteReadOnlyFiles="true"/>
  </Target>

2.如果仍然失败,将msbuild verbosity更改为Detailed并在输出窗口查看详细日志:

你可以根据那个日志弄清楚那个过程中发生了什么。

3.另外,如果你可以通过copy or xcopy command in cmd.exe将一个程序集复制到目标路径,你可以试试,如果可行,那么你也可以考虑使用Exec Task来做你想做的事。

4.如果以上都没有帮助,请分享您的项目类型的更多详细信息以及有关 rpoject(nuget packages...) 内容的详细信息。我想如果对$(OutDir) 有任何误解,也许实际上您是在尝试将其复制到publish/deploy 文件夹而不是正常的输出文件夹(bin\Debug\netcoreappx.x...)。

【讨论】:

  • 问题是我必须复制一个引用的 nuget 包的 DLL。我猜nuget正在覆盖我的文件。我最终为我的任务添加了重试。这样就解决了。
  • 很高兴知道它已解决,您可以考虑将其添加为self-answer 并标记它以帮助有类似问题的人:) 只是一个提醒!
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多