我正在尝试使用MSBuild 12.0构建一个缺少 packages
内容的解决方案(除了 repositories.config
内部) . 我希望它能在构建之前自动恢复所有丢失的软件包但事实并非如此--MsBuild报告了大量错误:
“你错过了使用指令或汇编引用吗?”
NuGet Manager是2.7(我在Visual Studio 2013中看到了这个框) . 我甚至试图传递 EnableNuGetPackageRestore=true
参数 - 没有运气 . 我错过了什么?
11 回答
UPDATED with latest official NuGet documentation as of v3.3.0
包恢复方法
如果您使用的是MSBuild 15附带的Visual Studio 2017,并且您的.csproj文件位于new PackageReference format中,则最简单的方法是use the new MSBuild Restore target .
没有人真的回答了原来的问题,这是"how do I get NuGet packages to auto-restore when building from the command-line with MSBuild?"答案是:除非你使用"Enable NuGet package restore"选项(现在根据this reference弃用),你不能(但见下文) . 如果您正在尝试例如在CI服务器上自动构建,这很糟糕 .
然而,有一种稍微迂回的方式来获得所需的行为:
从https://dist.nuget.org/win-x86-commandline/latest/nuget.exe下载最新的NuGet可执行文件并将其放在PATH中的某个位置 . (您可以将此作为预构建步骤 . )
运行nuget restore将自动下载所有丢失的包 .
运行
msbuild
以构建您的解决方案 .除此之外:虽然新的和推荐的自动包恢复方法涉及到版本控制中较少的混乱,但它也使命令行包恢复变得不可能,除非你跳过额外的下载和运行
nuget.exe
. 进展?如果要从命令行还原包,Nuget 's Automatic Package Restore is a feature of the Visual Studio (starting in 2013), not MSBuild. You'将必须运行 nuget.exe restore .
您还可以使用“启用Nuget包还原”功能,但nuget人员不再推荐此功能,因为它会对项目文件进行侵入式更改,如果您在其他解决方案中构建这些项目,可能会导致问题 .
我花了一些时间来弄清楚整个画面,我想在这里分享一下 .
Visual Studio有两种使用包还原的方法:自动包还原和MSBuild集成包还原 . 'MSBuild-Integrated Package Restore'在构建过程中恢复包可能会在某些情况下导致问题 . NuGet团队的'Automatic Package Restore'是the recommended approach .
有几个步骤可以使“自动包恢复”工作:
在Visual Studio,工具 - >扩展和更新中,如果有更新的版本(版本2.7或更高版本),请升级NuGet
如果使用TFS,请在解决方案的.nuget文件夹中删除NuGet.exe和NuGet.targes文件 . 然后编辑NuGet.Config以不检入NuGet包:
如果您之前已将解决方案的packages文件夹签入TFS,请删除该文件夹并检查是否删除了包文件夹删除 .
如果您不使用TFS,请删除.nuget文件夹 .
在解决方案中的每个项目文件中删除此行 .
工具 - >选项 - >包管理器 - >常规或工具 - > NuGet包管理器 - >包管理器设置
请启用以下两个选项:1)'允许NuGet下载丢失的包'2)'在Visual Studio中构建期间自动检查缺少的包'
按以下步骤测试程序包还原配置
保存解决方案并关闭Visual Studio
删除解决方案的包文件夹
启动Visual Studio,打开解决方案并重建它 .
伊恩坎普有答案(有点点btw ..),这只是为他的一个步骤添加一些肉 .
我最终在这里的原因是dev的机器正在构建良好,但构建服务器根本没有拉下所需的包(空包文件夹),因此构建失败 . 但是,登录到构建服务器并手动构建解决方案 .
要完成第二个Ians 3点步骤(运行 nuget restore ),您可以创建一个运行exec命令的MSBuild目标来运行nuget restore命令,如下所示(在这种情况下,nuget.exe位于.nuget文件夹中,而不是路径),然后可以在构建解决方案之前立即在TeamCity构建步骤(其他CI可用...)中运行
为了记录,我已经尝试了“nuget installer”运行器类型,但这一步骤挂在Web项目上(适用于DLL和Windows项目)
MSBuild 15有/t:restore option这样做 . 它附带Visual Studio 2017 .
如果你想使用它,你还必须使用新的PackageReference,这意味着用这样的元素替换
packages.config
文件(在* .csproj中这样做):项目中有一个 packages.config 文件,它包含包详细信息 .
还有一个包含 NuGet.exe and NuGet.targets 的.nuget文件夹 . 如果缺少任何一个文件,它将无法恢复丢失的包并导致"are you missing a using directive or an assembly reference?"错误
请注意,如果您使用TeamCity作为构建服务器,则会获得一个"NuGet Installer"步骤,您可以使用该步骤在构建步骤之前还原所有包 .
有时,当您在"packages"文件夹(即"Packages/EntityFramework.6.0.0/") but the "DLLs" are not inside it (大多数版本控制系统自动忽略".dll"文件)中有要恢复的软件包文件夹时,会发生这种情况 . 这是因为在NuGet尝试恢复每个包之前它会检查文件夹是否已经存在,所以如果存在,NuGet会假定"dll"在其中 . 因此,如果这是你的问题,只需删除NuGet将正确恢复它的文件夹 .
在Visual Studio 2017中 - 使用IDE编译时 - 它将下载所有缺少的nuget包并保存在“packages”文件夹中 .
但是在构建机器上编译是使用msbuild.exe完成的 . 在那种情况下,我下载了nuget.exe并保存在路径中 .
在执行msbuild.exe之前的每个构建过程中 . 它将执行 - > nuget.exe恢复NAME_OF_SLN_File(如果只有一个.SLN文件,那么你可以忽略该参数)
我有一个问题,nuget包没有被包含在使用devenv.exe构建sln文件的脚本化每晚构建中 .
我跟着advice from Microsoft,关键步骤是更新
%AppData%/NuGet
中的NuGet配置,使其包含: