二进制文件在构建时复制到错误的文件夹

Binary files copied to a wrong folder on build

最近的 libgit2sharp Nuget 使用了一个新的 Nuget 功能,允许您在 NuGet 中包含一段构建脚本。它的目的是将本机 dll 复制到 bin 文件夹的子文件夹中,如下所示:

    <ItemGroup>
    <None Include="$(MSBuildThisFileDirectory)\..\..\lib\net40\NativeBinaries\amd64\git2-e0902fb.dll">
        <Link>NativeBinaries\amd64\git2-e0902fb.dll</Link>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>...

现在,在本地一切都很好,但是当我将它部署到 AppHarbor 时,原生 dll 出现在 /bin 文件夹中(除了 target 子文件夹),导致我的应用程序失败。

问题出在 _CopyWebApplicationLegacy 目标上,它不会在本地执行(它是 运行 只有当你有一个非默认输出目录时),所以我没有这个问题我的开发机器。即,它执行以下代码:

<!-- Copy items that have been marked to be copied to the bin folder -->
<Copy SourceFiles="@(_SourceItemsToCopyToOutputDirectory)" 
      DestinationFolder="$(WebProjectOutputDir)\bin" 
      SkipUnchangedFiles="true" 
      Retries="$(CopyRetryCount)"
      RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"/>

您可以看到目标文件夹始终是 /bin -- 我相信这是 Microsoft.WebApplication.targets 文件中的错误(我无法在目标机器上控制它)。

是否有简单的修复方法,或者我应该恢复到 PostBuild 事件中的脚本(我必须使用每个新版本更新它)?

如此处所述:https://github.com/libgit2/libgit2sharp/issues/1089#issuecomment-111000722

AppHarbor 构建项目的方式触发了旧的 _CopyWebApplicationLegacy 目标,这基本上已被破坏。它通过将所有使用复制到输出目录 属性 的文件直接放入输出目录而不是尊重相对文件夹结构来搞乱所有文件。它也不会 运行 您可能拥有的任何 web.config 转换。

您可以通过将以下内容添加到您的项目文件来让您的项目使用较新的 _CopyWebApplication 目标:

<UseWPP_CopyWebApplication>True</UseWPP_CopyWebApplication>
<PipelineDependsOnBuild>False</PipelineDependsOnBuild>

我不确定的是 AppHarbor 是否出于某种原因不希望您使用较新的复制目标而不是旧的损坏目标。