Use*_*rol 106 .net msbuild build nuget nuget-package-restore
我正在尝试使用MSBuild 12.0 构建一个packages内容缺失(repositories.config内部除外)的解决方案.我希望它能在构建之前自动恢复所有丢失的软件包但事实并非如此--MsBuild会报告大量错误:
"你错过了使用指令或汇编引用吗?"
NuGet Manager是2.7(我在Visual Studio 2013中看到这个关于框).我甚至试图传递EnableNuGetPackageRestore=true参数 - 没有运气.我错过了什么?
Ian*_*emp 229
如果您使用的是MSBuild 15附带的Visual Studio 2017,并且您的.csproj文件采用新PackageReference格式,则最简单的方法是使用新的MSBuild Restore目标.
没有人真正回答了原来的问题,即"在使用MSBuild从命令行构建时如何让NuGet包自动恢复?" 答案是:除非您使用"启用NuGet包还原"选项(现在已按照此引用弃用),否则您不能(但请参见下文).如果您尝试在CI服务器上进行自动构建,这很糟糕.
然而,有一种稍微迂回的方式来获得所需的行为:
nuget restore将自动下载所有缺少的包.msbuild以构建您的解决方案.除此之外:虽然新的和推荐的自动包恢复方法涉及到版本控制中较少的混乱,但它也使得命令行包恢复变得不可能,除非您跳过额外的下载和运行环节nuget.exe.进展?
Owe*_*son 55
Nuget的自动包恢复是Visual Studio的一项功能(从2013年开始),而不是MSBuild.nuget.exe restore如果要从命令行还原包,则必须运行.
您还可以使用"启用Nuget包还原"功能,但nuget人员不再推荐此功能,因为它会对项目文件进行侵入式更改,如果您在其他解决方案中构建这些项目,可能会导致问题.
KMo*_*raz 35
自v3.3.0起最新的官方NuGet文档更新
NuGet提供了三种使用包恢复的方法.
自动包恢复是NuGet团队在Visual Studio中推荐的包恢复方法,它是在NuGet 2.7中引入的.从NuGet 2.7开始,NuGet Visual Studio扩展集成到Visual Studio的构建事件中,并在构建开始时恢复缺少的包.默认情况下启用此功能,但开发人员可以根据需要选择退出.
以下是它的工作原理:
- 在项目或解决方案构建中,Visual Studio会引发一个事件,即构建在解决方案中开始.
- NuGet响应此事件并检查解决方案中包含的packages.config文件.
- 对于找到的每个packages.config文件,枚举其包并在解决方案的packages文件夹中存在Checked for.
- 根据包源的顺序,从用户配置(和启用)的包源下载任何缺少的包.
- 下载软件包后,它们将解压缩到解决方案的packages文件夹中.
如果您安装了Nuget 2.7+; 选择一种方法来管理Visual Studio中的自动包还原非常重要.
有两种方法可供选择:
- (Nuget 2.7+):Visual Studio - >工具 - >包管理器 - >包管理器设置 - >启用自动包恢复
- (Nuget 2.6及以下)右键单击解决方案,然后单击"为此解决方案启用程序包还原".

从命令行构建解决方案时需要命令行程序包还原 ; 它是在早期版本的NuGet中引入的,但在NuGet 2.7中得到了改进.
nuget.exe restore contoso.sln
Run Code Online (Sandbox Code Playgroud)
MSBuild集成的程序包还原 方法是最初的程序包还原实现,虽然它在许多方案中继续有效,但它并未涵盖其他两种方法所解决的全套方案.
Yin*_*ing 17
我花了一些时间来弄清楚整个画面,我想在这里分享一下.
Visual Studio有两种使用包还原的方法:自动包还原和MSBuild集成包还原."MSBuild-集成软件包还原"可在构建过程中恢复可能在某些情况下导致问题的软件包."自动包恢复"是NuGet团队推荐的方法.
有几个步骤可以使"自动包恢复"工作:
在Visual Studio中,工具 - >扩展和更新,如果有更新的版本(版本2.7或更高版本),请升级NuGet
如果您使用TFS,请在解决方案的.nuget文件夹中删除NuGet.exe和NuGet.targes文件.然后编辑NuGet.Config以不检入NuGet包:
<configuration>
<solution>
<add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>
Run Code Online (Sandbox Code Playgroud)
如果您之前已将解决方案的packages文件夹签入TFS,请删除该文件夹并检查删除包文件夹删除.
如果您不使用TFS,请删除.nuget文件夹.
在解决方案中的每个项目文件(.csproj或.vbproj)中,删除引用NuGet.targets文件的行.参考文字如下:
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
Run Code Online (Sandbox Code Playgroud)
在解决方案中的每个项目文件中删除此行.
在Visual Studio菜单中,通过
工具 - >选项 - >包管理器 - >常规或工具 - > NuGet包管理器 - >包管理器设置
请启用以下两个选项:1)'允许NuGet下载丢失的包'2)'在Visual Studio中构建期间自动检查缺少的包'
按以下步骤测试包还原配置
MSBuild 15具有执行此操作的/ t:restore选项。它随Visual Studio 2017一起提供。
如果要使用它,则还必须使用新的PackageReference,这意味着用这样的packages.config元素替换文件(在* .csproj中执行此操作):
<ItemGroup>
<!-- ... -->
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
<!-- ... -->
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
如果右键单击“参考”,则会自动迁移到此格式(如果您只是打开Visual Studio,重建或打开“为解决方案管理NuGet程序包”窗口,它可能不会显示,它将开始出现)。
| 归档时间: |
|
| 查看次数: |
97839 次 |
| 最近记录: |