当依赖项将.targets导入添加到.csproj时,NuGet Restore失败

时间:2011-12-15 17:24:27

标签: nuget

我最近遇到了NuGet还原问题。我添加了项目依赖项(在本例中为PostSharp),然后启用了还原。我检查了源代码,但没有检查/ packages目录(因为我不需要......对吧!)。当TeamCity或其他开发人员抓取源并运行MsBuild时,他们会收到以下错误:

C:\TeamCity\buildAgent\work\e374975c0264c72e\ProjectName\ProjectName.csproj(70, 3): error MSB4019: The imported project "C:\TeamCity\buildAgent\work\e374975c0264c72e\packages\PostSharp.2.1.5.1\tools\PostSharp.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

问题是,NuGet还没有运行恢复/下载PostSharp或它的.targets文件。这对我来说就像一个NuGet错误,但想看看其他人是否也有这个问题。

任何人都有此问题或知道解决方案。是的,我可以签入/ packages目录,但为什么要使用NuGet呢?

4 个答案:

答案 0 :(得分:3)

另一种方法是修改有问题的<Import>元素,使其具有条件性,例如:

<Import Project="$(CodeAssassinTargets)" Condition="Exists($(CodeAssassinTargets))" />

这取决于先前<PropertyGroup>中定义的新属性。我通常在csproj文件的顶部添加一个带有其他“全局”标志的标志,例如:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <CodeAssassinTargets>$(SolutionDir)packages\CodeAssassin.ConfigTransform.1.1\tools\CodeAssassin.ConfigTransform.targets</CodeAssassinTargets>
        <AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings>
        <UseMsdeployExe>true</UseMsdeployExe>
    </PropertyGroup>

然后在适当的目标中,如BeforeBuild,提供一条有用的错误消息:

<Target Name="BeforeBuild">
    <Error Text="CodeAssassin.ConfigTransforms target is missing. It needs to exist at $(CodeAssassinTargets) in order to build this project!" Condition="!Exists($(CodeAssassinTargets))" />
</Target>

通过这些修改,即使从未进行过nuget包恢复,项目也会加载。如果启用了自动包恢复,则第一次构建尝试应该清除丢失的目标问题,但如果没有,则会进行一次手动包恢复。

答案 1 :(得分:1)

@ porterhouse91,你检查过你的csproj文件以确保它已经设置了适当的构建目标吗?
我还没有尝试过新的内置程序包还原功能,但我认为它的工作方式至少有点像之前的互联网上的工作流程。如果是这种情况,则在解决方案中启用“包还原”仅会影响解决方案中启用它时的项目。如果您在启用Package Restore后向解决方案添加了一个新项目(具有NuGet依赖项),则需要再次启用它。 另一种可能性:先前的工作流程涉及到您需要签入VCS的.nuget文件夹,因此您可能需要检查它是否尚未检入(如果内置的包恢复功能确实使用这种方法)。

顺便说一句,如果这个答案都有帮助的话,感谢斯蒂芬·里奇 - 他请我帮你试试。

答案 2 :(得分:1)

我也有这样的问题,但我能够修改源包中的.targets文件来解决它。基本上,RestorePackages是在构建项目时运行的构建目标。不幸的是,在满足导入之前,包甚至无法正确加载。解决此问题的唯一方法是将.targets文件作为内容包含在内,然后更改BuildDependsOn属性,以便在运行自定义任务之前恢复它。

<PropertyGroup>
  <BuildDependsOn Condition="$(BuildDependsOn.Contains('RestorePackages'))">
    RestorePackages;
    CustomTarget;
    $(BuildDependsOn);
  </BuildDependsOn>
  <BuildDependsOn Condition="!$(BuildDependsOn.Contains('RestorePackages'))">
    CustomTarget;
    $(BuildDependsOn);
  </BuildDependsOn>
</PropertyGroup>

要清楚,这对预构建的软件包没有帮助,但是如果您可以自己再次构建软件包,则可以修复它。

答案 3 :(得分:0)

我遇到了同样的问题,Visual Studio 2012和NuGet包未检入源代码管理。

错误:

The imported project "\packages\Microsoft.Bcl.Build.1.0.7\tools\Microsoft.Bcl.Build.targets" was not found. 
Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.

我发现msdn writeup的情况给出了以下解决方法,可以在没有NuGet包的情况下从源代码控制中获取项目。

  1. 停止使用包还原并签入所有包文件
  2. 在构建项目之前显式运行包还原
  3. 签入.targets文件
  4. 我决定使用选项#2,但是,NuGet目前(v2.6)没有包含从visual studio中的packages.config文件安装所有包的方法。一些搜索显示您需要在打开Visual Studio(Command Line)之前使用NuGet reference执行以下命令。

    c:\path\to\nuget.exe install -o packages project-folder\packages.config