【问题标题】:Vs2017: NuGet packages not restored with MSBuildVs2017:未使用 MSBuild 恢复 NuGet 包
【发布时间】:2018-01-22 17:02:56
【问题描述】:
  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>

我的 google-fu 让我失望了,任何和所有的想法都会得到很好的接受。

【问题讨论】:

    标签: msbuild visual-studio-2017 nuget-package-restore


    【解决方案1】:

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

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

    这里有几个问题:

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

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

    如果您想使用带有PackageReference 的 CI 构建项目,最安全的方法是创建一个具有还原和构建目标的 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>
    

    并使用它执行它

    msbuild /restore /t:Build build.proj
    

    【讨论】:

      【解决方案2】:

      我发现调用nuget restore MySolution.sln 将恢复软件包以获得解决方案。

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

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

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

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

      【讨论】:

        【解决方案3】:

        我也遇到了 MSBuild 不拉包的问题。我使用RestoreConfigFile将路径nuget.config文件添加到属性参数中

        RestoreConfigFile=$(MSBuildStartupDirectory)\.nuget\nuget.config
        

        并且还更改了 MSBuild 任务的 Targets 值:

        MSBuild Targets="Restore;Clean;Build" Projects=...
        

        Restore 目标实际上强制提取包,RestoreConfigFile 将其指向我的设置。

        【讨论】:

        • 永远不要在同一个调用中运行恢复和其他目标。使用具有不同属性的两个不同的&lt;MSBuild&gt; 任务来导致重新评估或在 ci 构建项目中创建恢复目标并使用msbuild.exe /restore 调用它(msbuild 15.5 功能)。但我认为 OP 在基于 packages.config 的项目方面存在问题,目前 Restore 目标未处理。
        猜你喜欢
        • 2017-11-26
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        相关资源
        最近更新 更多