使用 MSBuid.exe 编译项目,但没有使用 nuget 包安装 visual studio

Compile project with MSBuid.exe but without visual studio installed using nuget packages

如何在未安装 visual studio 的情况下通过 MSBuild 在计算机上构建使用 nuget 解析包的解决方案?

我尝试创建一个 .nuget 目录并将命令行 nuget.exe 存储在其中,但这没有帮助。或者这是不可能的?

谢谢!

所以您有一组使用 NuGet 包的项目,并且您希望能够在使用 MSBuild 构建之前或期间恢复这些包。

基本方法是在构建项目之前运行 NuGet.exe restore 为您的解决方案。因此,一个简单的方法是在构建解决方案之前创建一个批处理文件。

如果您希望 MSBuild 执行包还原,我知道三种方法。其中两个使用 MSBuild .targets 文件,该文件 运行 是解决方案的 NuGet.exe 恢复。另一种方法是简单地进行预构建步骤,运行s NuGet.exe 恢复您​​的解决方案。

  1. Visual Studio 启用 NuGet 包还原。
  2. Cross Platform NuGet restore 由 Daniel Cazzulino 创建。
  3. 运行s NuGet.exe 还原的简单预构建步骤。

请注意,Visual Studio 中的启用 NuGet 包还原菜单已被 NuGet 团队弃用。如果正在使用的 NuGet 包有自己的 MSBuild .targets 文件,则这种在构建期间执行 nuget 包还原的方法存在问题。选项 3 也会出现此问题。

Visual Studio 的“启用包还原”会向您的项目添加一个 NuGet.targets 文件。这个 .targets 文件 运行s NuGet.exe 通过定义一个 RestoreCommand 然后让 MSBuild 执行它来恢复你的 NuGet 包。此 NuGet.targets 文件的某些部分如下所示。

  <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>

 <!-- We need to ensure packages are restored prior to assembly resolve -->
 <BuildDependsOn Condition="$(RestorePackages) == 'true'">
    RestorePackages;
    $(BuildDependsOn);
</BuildDependsOn>

<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">        
    <Exec Command="$(RestoreCommand)"
          Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />

    <Exec Command="$(RestoreCommand)"
          LogStandardErrorAsError="true"
          Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>

Daniel Cazzulino 的包还原方法有一个 Before.[解决方案文件名].targets 文件,它类似于 NuGet.targets 文件。在构建解决方案之前使用 Before.YourSolution.targets 文件的一个优点是 运行,因此如果您的 NuGet 包使用它们自己的 .targets 文件,它不会像其他两个选项那样出现相同的问题。

最后一种方法与其他两种方法类似,但不是使用 .targets 文件,而是将预构建步骤添加到项目中 运行s NuGet.exe。这与将 NuGet.targets 文件的一些内容移动到您的项目中基本相同。

<Target Name="BeforeBuild">
  <PropertyGroup>
    <NuGet>$(SolutionDir)\.nuget\NuGet.exe</NuGet>
  </PropertyGroup>
  <Exec Command="$(NuGet) restore -SolutionDirectory $(SolutionDir)" />
</Target>