NuGet包还原未获取生成目标程序集(工具)

4
我在解决方案的两个项目中添加了Fody ProperyChanged。解决方案启用了软件包还原。然而,TFS构建服务在构建时失败并显示以下错误:

WindowsUI.csproj(443):未找到导入的项目“SolutionDir\Tools\Fody\Fody.targets”。请确认声明中的路径是否正确,并检查文件是否存在于磁盘上。

该文件夹确实不存在。我可以将其检入源代码控制,但是难道不应该由NuGet Package Restore填充吗?或者我对NuGet Package Restore的理解有误吗?
4个回答

3
我遇到了类似的问题,尝试在Visual Studio Online上构建解决方案。问题是,在项目构建之前会还原包,但在此之前,项目文件和来自包的目标包含(仍需还原)已经被解释。请使用此处描述的“构建前钩子”。

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>

2

更新:此答案现仅适用于1.13.0.0之前的版本。

SolutionDir\Tools\Fody中的文件无法通过NuGet部署,需要检入源代码控制。


好的,谢谢官方回答,Simon :) - 由于该项目是多个解决方案的一部分,每个解决方案都需要Tools文件夹下的文件,所以在将其标记为答案之前,我将尝试Sayed的解决方案。 - Matthias Meid
@Mudu,请看一下我在Sayeds答案上的评论。 - Simon

2

1

你遇到了我之前在尝试使用NuGet包进行构建更新时遇到的相同问题。问题在于,在构建过程中会调用NuGet包还原。因此,如果NuGet包还原还原了一个被导入的.targets文件,则恢复太晚了。在文件写入磁盘时,<Import元素已经被评估并由于文件不在磁盘上而被跳过。

我发现最好的方法是构建另一个项目来调用包还原。为了使我的SlowCheetah NuGet包更加顺畅,当安装NuGet包时,我在与.csproj/.vbproj相同的目录中创建了一个packageRestore.proj文件。然后用户可以构建此项目文件,然后构建.sln/.csproj/.vbproj。通过这样做,NuGet包将被还原,然后启动构建过程。

如果您有兴趣使用我的packageRestore.proj,我可以将SlowCheetah NuGet包的该部分重构为自己的部分,您的NuGet包可以依赖于该部分。如果您对此感兴趣,请告诉我。


谢谢(不是我给你点了踩),我会试一下这个方法,看看它是否比Simon建议的检查更适合我们的需求。在提问之前,我尝试过的是只检查Fody.targets并重新排序构建步骤 - 但没有成功。 - Matthias Meid
谢谢,当人们没有留下评论就给我点踩的时候,我感到很沮丧:( 很高兴知道不是你。 - Sayed Ibrahim Hashimi
@SayedIbrahimHashimi 我给你投了反对票。是的,我真的应该加上评论。抱歉我的错。我投反对票是因为你的解决方案根本行不通。所涉及的文件并不是 NuGet 包的一部分,因此任何尝试还原它们的操作都不会起作用。 - Simon
根据问题,我假设Fody.targets在NuGet包中,并且OP启用了软件包还原,希望文件能够及时放置在服务器上以便导入。如果不是这种情况,那么您的方法可能不起作用。我不熟悉使用的软件包。 - Sayed Ibrahim Hashimi
@SayedIbrahimHashimi 我在项目中添加了一个预构建事件,使用 "$(SolutionDir).nuget\nuget" install "$(ProjectDir)packages.config" -OutputDirectory "$(SolutionDir)Packages" 来在构建之前还原包。我想知道这是否也是解决你所描述的问题的一种方法,尽管不够顺畅? - Matthias Meid
如果“预构建”事件在项目本身中,并且依赖于NuGet包来还原在构建期间导入的文件,则会遇到相同的问题。NuGet包恢复本身是作为目标实现的,该目标在“预构建”时执行。问题在于它是构建的一部分,不是技术上的构建前而是在构建期间。 - Sayed Ibrahim Hashimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接