二进制文件复制到构建

时间:2015-06-06 17:20:28

标签: msbuild appharbor post-build-event libgit2sharp

最近的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文件夹中(除了目标子文件夹之外),这导致我的应用程序失败。

问题出在_CopyWebApplicationLegacy目标,它不在本地执行(仅当你有一个非默认输出目录时才运行),因此我的dev机器上没有这个问题。即,它执行以下代码:

<!-- 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事件中的脚本(我必须使用每个新版本更新)?

1 个答案:

答案 0 :(得分:3)

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

AppHarbor正在构建您的项目的方式,它触发了旧的_CopyWebApplicationLegacy目标,而且基本上已经破解了。它将使用“复制到输出目录”属性的所有文件混淆,方法是将它们直接放入输出目录,而不是考虑相对文件夹结构。它也不会运行您可能拥有的任何web.config转换。

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

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

我不确定的是AppHarbor是否有理由不让他们使用较新的复制目标而不是旧的复制目标。