NuGet自动包恢复不适用于MSBuild

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服务器上进行自动构建,这很糟糕.

然而,有一种稍微迂回的方式来获得所需的行为:

  1. https://dist.nuget.org/win-x86-commandline/latest/nuget.exe下载最新的NuGet可执行文件,并将其放在PATH中的某个位置.(您可以将此作为预构建步骤.)
  2. 运行nuget restore将自动下载所有缺少的包.
  3. 运行msbuild以构建您的解决方案.

除此之外:虽然新的和推荐的自动包恢复方法涉及到版本控制中较少的混乱,但它也使得命令行包恢复变得不可能,除非您跳过额外的下载和运行环节nuget.exe.进展?

  • 这应该是正确的答案,而不是标记的答案. (39认同)
  • 我使用Jenkins并且必须这样做,这是一个简单的构建步骤,然后调用msbuild - Windows批处理文件是构建步骤类型,并且:cmd.exe/c"C:\ Program Files \nuget \nuget.exe"restore < RelativePathToSln> .sln - 我做了一个习惯/程序SLN的路径,以防它找不到sln文件. (2认同)

Owe*_*son 55

Nuget的自动包恢复是Visual Studio的一项功能(从2013年开始),而不是MSBuild.nuget.exe restore如果要从命令行还原包,则必须运行.

您还可以使用"启用Nuget包还原"功能,但nuget人员不再推荐此功能,因为它会对项目文件进行侵入式更改,如果您在其他解决方案中构建这些项目,可能会导致问题.

  • 如果您的NuGet版本不是至少2.7,则需要在使用restore-command之前运行"nuget update -self".我的NuGet是2.1版,在更新之前无法识别"恢复"命令. (2认同)
  • "如果你在另一个解决方案中构建这些项目会导致问题"我还没有遇到任何问题,我们有3个解决方案,每个解决方案包含数十个项目(许多项目共享解决方案).也许我很幸运? (2认同)
  • @OwenJohnson我们为所有解决方案都有一个通用的包文件夹,这可能就是为什么我们没有遇到问题. (2认同)

KMo*_*raz 35

自v3.3.0起最新的官方NuGet文档更新

包恢复方法

NuGet提供了三种使用包恢复的方法.


自动包恢复是NuGet团队在Visual Studio中推荐的包恢复方法,它是在NuGet 2.7中引入的.从NuGet 2.7开始,NuGet Visual Studio扩展集成到Visual Studio的构建事件中,并在构建开始时恢复缺少的包.默认情况下启用此功能,但开发人员可以根据需要选择退出.


以下是它的工作原理:

  1. 在项目或解决方案构建中,Visual Studio会引发一个事件,即构建在解决方案中开始.
  2. NuGet响应此事件并检查解决方案中包含的packages.config文件.
  3. 对于找到的每个packages.config文件,枚举其包并在解决方案的packages文件夹中存在Checked for.
  4. 根据包源的顺序,从用户配置(和启用)的包源下载任何缺少的包.
  5. 下载软件包后,它们将解压缩到解决方案的packages文件夹中.

如果您安装了Nuget 2.7+; 选择一种方法来管理Visual Studio中的自动包还原非常重要.

有两种方法可供选择:

  1. (Nuget 2.7+):Visual Studio - >工具 - >包管理器 - >包管理器设置 - >启用自动包恢复
  2. (Nuget 2.6及以下)右键单击解决方案,然后单击"为此解决方案启用程序包还原".


从命令行构建解决方案时需要命令行程序包还原 ; 它是在早期版本的NuGet中引入的,但在NuGet 2.7中得到了改进.

nuget.exe restore contoso.sln
Run Code Online (Sandbox Code Playgroud)

MSBuild集成的程序包还原 方法是最初的程序包还原实现,虽然它在许多方案中继续有效,但它并未涵盖其他两种方法所解决的全套方案.

  • nuget不再推荐这一点.查看文档.http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore (62认同)
  • 自动包还原取代了ms-build集成还原.该文档是有关如何升级的说明.如果您没有使用msbuild集成方法的问题,则无需执行任何操作.在最简单的情况下,它可以工作,但如果您有CI服务器,共享项目引用或其他一些条件,您可能会踩到一些讨厌的地雷并且有不正确的提示路径或其他问题. (5认同)

Yin*_*ing 17

我花了一些时间来弄清楚整个画面,我想在这里分享一下.

Visual Studio有两种使用包还原的方法:自动包还原和MSBuild集成包还原."MSBuild-集成软件包还原"可在构建过程中恢复可能在某些情况下导致问题的软件包."自动包恢复"是NuGet团队推荐的方法.

有几个步骤可以使"自动包恢复"工作:

  1. 在Visual Studio中,工具 - >扩展和更新,如果有更新的版本(版本2.7或更高版本),请升级NuGet

  2. 如果您使用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文件夹.

  3. 在解决方案中的每个项目文件(.csproj或.vbproj)中,删除引用NuGet.targets文件的行.参考文字如下:

    <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
    
    Run Code Online (Sandbox Code Playgroud)

    在解决方案中的每个项目文件中删除此行.

  4. 在Visual Studio菜单中,通过

    工具 - >选项 - >包管理器 - >常规或工具 - > NuGet包管理器 - >包管理器设置

    请启用以下两个选项:1)'允许NuGet下载丢失的包'2)'在Visual Studio中构建期间自动检查缺少的包'

  5. 按以下步骤测试包还原配置

    • 保存解决方案并关闭Visual Studio
    • 删除解决方案的包文件夹
    • 启动Visual Studio,打开解决方案并重建它.

  • 我认为你在模板本身就错了.没有它,您的源文件根本不会构建. (3认同)
  • 我认为他的意思是nuget.targets而不是Microsoft.CSharp.targets. (3认同)
  • http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore < - 这是Ying试图说的官方文档. (2认同)

Chr*_*ris 5

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程序包”窗口,它可能不会显示,它将开始出现)。