Vs2017:使用MSBuild

时间:2018-01-22 17:02:56

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

  1. 我从VS2017构建并下载了包和项目 建立。
  2. 然后我核了包文件夹。
  3. 然后我使用MSBuild构建项目失败,因为包不是 存在,他们还没有恢复。
  4. 我有#34;下载丢失的软件包"在

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

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

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

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

3 个答案:

答案 0 :(得分:8)

基于

var map = {} for (var i = 0; i < 3; i++) { map["key"+i] = i } ref.child("values").update(map) 的项目需要通过NuGet恢复,而不是MSBuild。 Visual Studio通过VS请求构建时执行此操作。如果需要从命令行执行此操作,则需要使用命令行packages.config实用程序来还原软件包。

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

这里有一些问题:

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

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

  3. 如果要使用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>
    

答案 1 :(得分:3)

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

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

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

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

Nuget.exe不必位于每个项目文件夹中,只需在包含build的文件夹中。

答案 2 :(得分:0)

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

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

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

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

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