在现代软件开发中,依赖管理是一个不可或缺的环节。NuGet 作为.NET平台的包管理工具,极大地简化了这一过程。它不仅支持从公共库中添加包,还可以创建私有库以满足企业特定的需求。本文将探讨NuGet如何在企业环境中发挥作用,以及如何利用它来提高开发效率。
NuGet 允许开发者通过添加第三方代码或工具来扩展应用程序的功能。大多数托管在NuGet公共库中的项目都是免费且开源的。可以通过两种方式访问NuGet:使用库包管理器的图形界面或通过包管理器控制台窗口。
要打开库包管理器,可以点击“工具” > “库包管理器” > “管理NuGet包解决方案…”。安装包只需点击并选择“安装”。可以使用搜索字段(右上角)轻松搜索包,有成千上万的免费包可供选择。
私有NuGet库是自己托管的库。它可以位于本地机器上,或者公司网络的任何地方。实际上,也可以选择托管自己的公共库。
那么,创建私有库有什么好处呢?最好的回答方式是通过一个场景。假设正在为不同的客户开发多个网站,它们有很多共同的代码。不想重复代码,因此创建了一个库并将共享代码放入其中。然后,每个项目都会引用这个库。这是一个非常常见的场景,非常普遍。但是,如果共享代码存在于源代码库的另一个分支中呢?如果每个网站都有自己的分支呢?那么每次更新库时,都需要手动合并程序集到其他分支中。NuGet大大简化了这个过程,只需要发布并更新到库,每个网站可以选择是否更新。有些网站可能不想更新,可能是因为破坏性变更。每个项目可以决定是否更新。
每个好的包都从一个好的库开始。可能已经很清楚哪些库想要转换成包。为了演示,将使用一个名为JPreeceDev.Shared.dll的共享库。这个共享库由一个类Repository和一个接口IRepository组成:
public interface IRepository
{
bool Save();
}
public class Repository : IRepository
{
public bool Save()
{
return true;
}
}
要创建包,首先需要一个名为NuGet命令行引导程序的小命令行工具。下载后,可以为它添加一个环境变量,或者在命令提示符窗口中直接指向完整路径。
在这个阶段,可以选择几条路线,这真的取决于偏好、内部流程或源代码控制系统的设置。为了简单起见,将在与项目文件夹同级的位置创建一个名为“NuGet Packages”的新目录。在这个文件夹内,将创建一个名为JPreeceDev.Shared的子文件夹,NuGet包的所有组件都将放在这里。可能想要:在源代码控制中创建一个专用的NuGet包分支,或者在开发分支中专门添加一个文件夹用于NuGet包。
打开命令提示符,切换工作目录到NuGet packages/项目文件夹,并运行以下命令:
nuget spec
这将输出一个非常通用的Package.nuspec文件,它包含一些简单的XML。用最喜欢的文本编辑器打开文件,并用一些适当的信息编辑XML。以下是示例:
<?xml version="1.0"?>
<package>
<metadata>
<id>JPreeceDev.Shared</id>
<version>1.0.0</version>
<authors>Jon Preece</authors>
<owners>Jon Preece</owners>
<licenseUrl>http://www.codeproject.com/info/cpol10.aspx</licenseUrl>
<projectUrl>http://www.jpreecedev.com</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>JPreeceDev.com Shared Code Library</description>
<releaseNotes>First release.</releaseNotes>
<copyright>Copyright Jon Preece 2013</copyright>
<tags>jpreece shared</tags>
</metadata>
</package>
还喜欢将文件重命名,使其对项目更有意义。将Package.nuspec重命名为JPreeceDev.Shared.nuspec。
现在需要引入库文件。首先创建一个名为‘lib’的新文件夹,与.nuspec文件同级。在其中需要创建另一个文件夹,告诉NuGet库针对哪个版本的.NET Framework。在这种情况下,通过添加一个名为NET4.5的文件夹来针对.NET Framework 4.5:
将库放入该文件夹。
接下来,返回命令提示符并运行以下命令:
nuget pack
NuGet将输出NuGet包,文件扩展名为.nupkg。简单NuGet包现在已经完成,已经准备好告诉NuGet私有库了。
下一步是告诉NuGet刚刚创建的私有库。这样,当稍后搜索要添加到项目的NuGet包时,NuGet会知道在哪里查找。
打开Visual Studio,点击“工具” > “选项” > “包管理器” > “包工具”。点击右上角的“添加”按钮,给包源一个名字(在这种情况下,本地NuGet包),并将路径设置回之前创建的NuGet Packages文件夹:
点击更新,然后点击确定保存更改。现在启动想要消费库的项目,在库包管理器中,注意私有库现在在‘在线’标签下可用:
要将包添加到项目,只需点击安装,并接受许可协议。
注意引用现在已经添加到项目中,库中的代码可以像平常一样使用。
如果一直在Visual Studio中跟随,可能会想“这是很多努力,会坚持当前的流程,因为这是熟悉的,知道它有效”。好吧,坚持下去,因为这是NuGet真正发挥作用的地方……当更新包时。
假设已经过了一段时间,对共享库做了一些更改。对更改感到满意,并且确信库相对没有错误,所以是时候向所有使用库的项目推送更新了。
打开NuSpec文件(在这种情况下,JPreeceDev.Shared.nuspec),增加构建次版本号,并添加一些发布评论。现在复制共享库DLL(JPreeceDev.Shared.dll)并打开命令提示符。再次运行NuGet pack命令:
nuget pack
NuGet创建了一个新的包,新版本号附加在包上;
再次启动项目,如果没有自动提示更新包,打开库包管理器并点击‘更新’标签。
如所见,更新现在对项目可用。继续点击更新按钮以完成更新。更新后的程序集现在已经添加到项目中。简单,对吧?
在本教程中,只访问了如何创建一个简单的NuGet包。可以利用更多高级功能为包添加额外的功能:
…等等。