最近的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事件中的脚本(我必须使用每个新版本更新)?
答案 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是否有理由不让他们使用较新的复制目标而不是旧的复制目标。