Vs2017:使用MSBuild无法恢复NuGet包

Bin*_*ier 5 msbuild nuget-package-restore visual-studio-2017

  1. 我从VS2017构建,下载包并构建项目.
  2. 然后我核了包文件夹.
  3. 然后我使用MSBuild构建项目失败,因为包不存在,它们尚未恢复.

我已经"下载了丢失的软件包"

项目文件最初是在VS 2013中创建的

build.proj使用MSBuild任务来构建解决方案.

<MSBuild Projects ="$(root)\src\MySolution.sln" ContinueOnError ="false" Properties="Configuration=$(Configuration)">
    <Output ItemName="OutputFiles" TaskParameter="TargetOutputs"/>
</MSBuild>
Run Code Online (Sandbox Code Playgroud)

我的google-fu失败了我,任何和所有想法都会得到很好的收到.

Mar*_*ich 9

packages.config基于项目需要通过NuGet来恢复,而不是MSBuild.Visual Studio通过VS请求构建时执行此操作.如果需要从命令行执行此操作,则需要使用命令行nuget.exe实用程序来还原软件包.

只有PackageReference引用NuGet包的方式才会集成到MSBuild中.您可以通过从项目中卸载所有NuGet包,并更改默认包管理格式或选择"允许在第一个包安装时选择格式"复选框来切换到此格式.然后您可以重新添加包(只需要顶级包)并确保它不生成packages.config文件.

这里有一些问题:

  1. 还原后,MSBuild必须重新评估项目文件.在<MSBuild>CI脚本中使用任务时,只有在将一组不同的属性传递给任务时才会发生这种情况.这是因为还原obj\会在评估期间检查的目录中生成自动导入的文件.

  2. 如果还原没有生成,但是更改这些文件,这还不够,并且必须使用干净的xml缓存重新评估项目.这项<MSBuild>任务无法实现.MSBuild 15.5引入了一个/restore执行Restore目标的选项,然后清理这些缓存(之前没有API)并按要求执行其余的构建.在15.5之前,msbuild.exe需要进行两次单独的调用以确保增量恢复+构建产生正确的输出.

如果要使用CI构建项目PackageReference,最安全的方法是创建build.proj具有还原和构建目标的项目:

<Project>
  <Target Name="Restore">
    <MSBuild Projects="$(root)\src\MySolution.sln" Targets="Restore" />
  </Target>
  <Target Name="Build">
    <MSBuild Projects="$(root)\src\MySolution.sln" Targets="Build" />
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

并使用执行它

msbuild /restore /t:Build build.proj
Run Code Online (Sandbox Code Playgroud)


Bin*_*ier 5

我发现调用nuget restore MySolution.sln将恢复解决方案的包。

我放入nuget.exe我的构建文件夹,并为我的源树中的每个解决方案运行恢复。

我的 MsBuild 目标是为所有解决方案中的所有项目恢复包。

<Target Name="NuGetRestore">
  <ItemGroup>
    <slns Include="$(MSBuildProjectDirectory)\..\**\*.sln"/>
  </ItemGroup>
  <Exec Command="$(MSBuildProjectDirectory)\nuget restore %(slns.Identity)"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

Nuget.exe 不必在每个项目文件夹中,只需在 build.gradle 文件夹中即可。