根据您需要的集成程度,有多种不同的解决方案可将 NuGet 集成到您的构建过程中。在我们的案例中,我们希望使用 NuGet 作为包管理器,并允许开发人员构建他们的解决方案,即使他们没有在他们的机器上安装 NuGet。为此,我们启用了包还原,它将 NuGet 二进制文件添加到您的解决方案文件夹并更新项目文件。请注意,NuGet 并不总是正确更新项目文件。在我们的例子中,我们发现一些项目文件得到了更新,而其他的却没有。要验证项目是否已更新,您需要将项目文件作为 XML 文件打开。要实现此加载解决方案并右键单击有问题的项目并选择卸载项目。然后再次右键单击该项目并选择编辑 [PROJECT_NAME]。在项目文件中你应该看到
- 第一个属性组中的
RestorePackages 属性。此属性的值应为 true
- 项目文件末尾的
import 语句。此导入语句应指向 NuGet 二进制文件随附的“NuGet.targets 文件”。
以下是我们的一个项目文件的示例(经过大量编辑)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir>
<ProjectGuid>{8B467882-7574-41B2-B3A8-2F34DA84BE82}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>MyCompany.MyNamespace</RootNamespace>
<AssemblyName>MyCompany.MyNamespace</AssemblyName>
<!-- Allow NuGet to restore the packages if they are missing -->
<RestorePackages>true</RestorePackages>
</PropertyGroup>
<Import Project="$(SolutionDir)\BaseConfiguration.targets" />
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="MyClass.cs" />
<!--
.... MANY MORE FILES HERE
-->
</ItemGroup>
<!-- Import the Nuget.targets file which integrates NuGet in the build process -->
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
您需要采取的下一步是提供解决方案级别的 NuGet 配置文件,您将在其中指出需要“安装”包的位置以及 package repository 的 URL 是什么。在我们的例子中,解决方案目录结构如下所示:
(D) root
(D) build
(D) packages
(D) source
(D) .nuget
NuGet.config
NuGet.exe
NuGet.targets
(D) MyCoolProject
MyCoolProject.csproj
MyCoolProject.sln
(D) templates
NuGet.Config
其中(D) 表示一个目录。
NuGet.config 文件包含以下配置设置。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageRestore>
<add key="enabled" value="True" />
</packageRestore>
<config>
<add key="repositorypath" value="packages" />
</config>
<packageSources>
<add key="OurPackageServer" value="PACKAGE_SERVER_ADDRESS" />
</packageSources>
<activePackageSource>
<add key="All" value="(Aggregate source)" />
</activePackageSource>
</configuration>
此配置文件表示启用了包还原,存储库路径(放置包的位置)是包目录以及哪些包源处于活动状态。
通过将 NuGet.config 文件放在根目录中,我们可以在 NuGet 中使用 hierarchical configuration 选项。这允许单独的解决方案覆盖计算机特定的配置。另一个好处是这样我们就不需要在构建服务器上安装 NuGet(因为可执行文件和配置都在存储库中)。
通过此设置,开发人员可以从 Visual Studio 构建解决方案。即使没有安装 NuGet,构建也应该在开发人员机器上正常工作。但是请注意,如果没有在 Visual Studio 中安装 NuGet,他们将无法将包添加到项目中。
在构建服务器上,您可以简单地使用 MsBuild 构建解决方案,该解决方案将自动从您的包存储库下载包。不需要为此在构建机器上安装 Visual Studio(只需您选择的 .NET 框架)。