我最近遇到了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呢?
答案 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包的情况下从源代码控制中获取项目。
我决定使用选项#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