我将Fody ProperyChanged添加到我的解决方案中的两个项目中。解决方案上启用了包还原。但是,TFS 构建服务构建失败并出现以下错误:
WindowsUI.csproj (443):未找到导入的项目“SolutionDir\Tools\Fody\Fody.targets”。确认声明中的路径正确,并且该文件存在于磁盘上。
该文件夹确实不存在。显然,我可以将其签入源代码控制。但是,它不应该由 NuGet 包还原填充吗?还是我误解了 NuGet 包还原的作用?
我将Fody ProperyChanged添加到我的解决方案中的两个项目中。解决方案上启用了包还原。但是,TFS 构建服务构建失败并出现以下错误:
WindowsUI.csproj (443):未找到导入的项目“SolutionDir\Tools\Fody\Fody.targets”。确认声明中的路径正确,并且该文件存在于磁盘上。
该文件夹确实不存在。显然,我可以将其签入源代码控制。但是,它不应该由 NuGet 包还原填充吗?还是我误解了 NuGet 包还原的作用?
我在尝试在 Visual Studio Online 上构建解决方案时遇到了类似的问题。问题是包在项目构建之前被恢复,但在此之前项目文件和包中的目标包含(仍待恢复)已经被解释。
使用这里描述的 before build 钩子:
http://sedodream.com/2010/10/22/MSBuildExtendingTheSolutionBuild.aspx
在您的 before.solutionname.sln.targets 文件中放置类似这样的内容,以强制在构建第一个项目之前恢复所有包:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0"
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="BeforeBuild" BeforeTargets="Build">
<Message Text="Restoring all nuget packages before build" Importance="high">
</Message>
<Exec Command=".\.nuget\NuGet.exe restore YourSolution.sln" />
</Target>
</Project>
如果您有外部包源,请在您的 nuget.config 文件中配置它们,该文件也应该在 .nuget 文件夹中。例如:
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
<packageSources>
<add key="NuGet official package source" value="https://nuget.org/api/v2/" />
<add key="YourSource" value="http://yoursource.somewhere.net/nuget" />
</packageSources>
<packageRestore>
<!-- Allow NuGet to download missing packages -->
<add key="enabled" value="True" />
<!-- Automatically check for missing packages during build in Visual Studio -->
<add key="automatic" value="True" />
</packageRestore>
</configuration>
更新:此答案现在仅适用于 1.13.0.0 之前的版本。
里面的文件SolutionDir\Tools\Fody
不能通过nuget部署,需要签入源码管理
从 1.13.0.0 版(2013 年 3 月 23 日发布)开始,Fody 是一个 100% 的 nuget 部署工具,因此它可以与包还原一起使用。
https://nuget.org/packages/Fody/
这将在您安装 Fody Nuget 时出现 https://github.com/Fody/Fody/blob/master/NuGet/readme.txt
当我尝试在 NuGet 包中发布构建更新时,您遇到了同样的问题。问题是在构建过程中调用了 NuGet 包还原。因此,如果 NuGet 包还原还原已导入的 .targets 文件,则还原为时已晚。到文件写入磁盘时,<Import
由于文件不在磁盘上,该元素已被评估并跳过。
我发现的最好的事情是构建另一个项目来为您调用包还原。为了在安装 NuGet 包时为我自己的SlowCheetah NuGetpackageRestore.proj
包解决这个问题,我在与 .csproj/.vbproj 相同的目录中创建了一个文件。然后用户可以构建此项目文件,然后构建 .sln/.csproj/.vbproj。通过这样做,NuGet 包被恢复,然后构建过程开始。
如果您有兴趣使用我的packageRestore.proj
我可以将 SlowCheetah NuGet 包的那一部分重新分解为它自己的一部分,并且您的 NuGet 包可以依赖于那个。如果您对此感兴趣,请告诉我。