使用。net进行依赖管理-正确操作

依赖管理的问题既不是新的也不是独创的,它存在于所有的开发平台中,. net也不例外。
让我们研究一下不同的解决方案,看看它们的性能如何。我将在这里不分先后地列出它们。

在源代码控制中保持依赖关系
这是一个非常受欢迎的解决方案,而且是有原因的。好处是显而易见的。以下是其中一些:

  • 没有设置。您已经有了适当的源代码控制(,我希望你这么做!)添加bin目录,就可以了。
  • 没有学习曲线。开发人员习惯于处理源代码控制。
  • 共享。整个团队变化以及发生时来自服务器的更新。
  • Enterprisy(以好的方式)。软件已经验证,备份,DRP已经完成。

听起来不错,不是吗?那么,它有什么问题呢?只有一件事——源码控制系统被设计用来控制,嗯,源码。作为这样的他们不太擅长控制二进制。以下是我们在使用版本控制系统依赖过程中遇到的缺点:

  • 它不是一个代理。VCS无法下载所需的依赖项当您需要一个中央存储库时。您需要手动下载并添加到VCS中。历史记录从那里开始—您只是失去了到原始文件的链接。所以,你努力工作,在此之上却丢失了信息;这重复本身对于每个新的依赖项。
  • 版本控制不匹配。源文件版本化他们的内容。人来说知道如何diff他们会明白是什么改变了。另一边,通常是双星版本化他们的名字。从风投点它们是不同的条目,每一个都没有任何版本历史。
  • 一些非常流行的vcs(如Subversion)不能删除文件。这意味着——一旦添加了一个文件,它保持永远保存在存储库中。对于小的源文件来说,这不是一个大问题,但当涉及到过时的大型二进制文件时,这可能会成为相当大的麻烦。
  • 源代码控制知道如何搜索源代码。当然,最重要的搜索类型是按内容搜索。搜索二进制文件是不同的:重要的是位置、文件名的结构,以及(如果是存档的工件)的内容存档
  • 权限为客户量身定制版本控制来源(!)。例如,没有覆盖权限。这是因为我们一直在做的事情就是重写资源diff在VCS中是for的)——它的安全级别与添加一个新的源文件相同。对于二进制文件,情况就非常不同了。虽然添加新的二进制文件是可以的,但重写已发布的二进制文件是不应该做的事情,应该有一个特殊的许可为它。
  • 分布式vcs本身就很厉害,特别不适合处理大的二进制文件。将远程存储库克隆到您的把所有档案的历史记录都带来了吗.现在想想那些巨大的二进制文件……

如你所见,结论很简单——我们可以做得更好。让我们尝试一些专门用于二进制的东西。

总署、WebGAC
全局程序集缓存与VCS是矛盾的为存储二进制文件量身定制。它可以理解版本,防止冲突,通常可以很好地充当本地依赖项存储。GAC的主要问题是本地化,这意味着每个开发人员都应该从某个地方获取二进制文件,并将它们安装到本地GAC中。你看到了这个计划带来的麻烦,不是吗?WebGAC来拯救这里。它本质上是WebDAV共享的GAC,并允许客户端从服务器获取依赖项,从而简化了操作依赖关系团队管理。让我们来计算一下利弊。的好处:

  • GAC是二进制管理的良好、标准和经过验证的解决方案。它可以很好地处理版本。
  • WebGAC是一个团队的中央二进制库。每个团队成员都与它同步。
  • WebDAV是流行的知名HTTP扩展具有锁定、安全管理等功能。使用Apache WebDAV模块通常很简单。

让我们看看在这个解决方案中,什么是不太管用的:

  • 它不是一个代理。WebGAC无法下载所需的依赖项当您需要一个中央存储库时。您需要手动下载它,将它添加到WebGAC中,只有这样团队才能使用它。您不仅必须为所需的每个依赖项的每个版本工作,到原始文件的链接也会丢失。
  • 没有包的概念。广汽包含单dll.你一个一个地安装它们。但以《NUnit》为例。它包含了大约12个dll以及各种XML和配置文件。如何安装它广汽?
  • 安全是繁琐的。您需要配置Apache Server的安全性,即使这样,它也无法灵活地进行取舍部署人员(可以发布私有依赖项的用户)和启动器(可以将依赖项从私有存储库移动到公共存储库的用户)。
  • 搜索是基本的。WebDAV本身只知道文件。它不关心的结构文件名,或关于强名称的存在。

看来我们还是没找到要找的东西,然后…

NuGet来了
这是另一回事。NuGet设计为“一个开发人员关注的。net平台包管理系统,旨在简化将第三方库合并到。net平台的过程。NET应用程序开发”。这正是我们所需要的。让我们看看它有多棒:

  • 管理包,不dll
  • 提供了NuGet画廊-几乎4.5K(在写这篇文章的时候)的软件包可以满足你所有的开发需求。
  • 支持二进制版本控制
  • 与Visual Studio集成。
  • 与您的构建集成。
  • 与您的构建服务器集成(仅TeamCity撰写本文之时)。

这个工具就像梦想成真。那么,我能提到什么缺点呢?大多数都是缺点NuGet画廊的,不是NuGet本身。Gallery是一个年轻且相对较小的项目(为了便于比较,Maven Central已经有6年的历史了,包含了超过290K的工件),因此,它也有它的缺点:

  • 提交给画廊的内容(几乎)未经核实。每个人都可以注册,获得API密钥并开始上传他们喜欢的任何东西。可怕,不是吗?(是的非常可怕的)。
  • NuGet Gallery是公开的,不能用于团队之间交换。私人远程提要是推荐的解决方案。接下来我们来看看它是否足够好。

使用NuGet远程提要
远程提要,对于任何开发团队来说都是至关重要的需求。它有双重作用:它允许分享3日无法使用的派对包画廊(或者甚至为那些不信任它的人取代Gallery),它充当内部部署的目标——用于团队协作和其他用途,例如使包可用于QA,或者甚至从外部世界向客户提供它们(通过使用巧克力色,例如)。如果这是对的,那又有什么错呢?这就是:

  • 你已经看到了它的到来:它不是一个代理。你现在知道情况了。
  • 它不能聚合。的NuGet远程饲料暴露一个整体存储库:您的机器上的那个。它不能聚合来自远程存储库的NuGet包,也不能公开数量本地存储库的(例如,由于安全原因而分离)。
  • 您不能附加自己的元数据。假设您想用兼容性信息(例如:作品某些浏览器)。不,不能做。
  • 这个存储库非常简单。它不提供任何网页界面;它只能从客户端进行浏览和搜索——无论是Visual Studio还是命令行界面(本身非常基本)。
  • 甚至VS搜索界面也非常基础(你所拥有的只是任意排序和自由文本搜索)。这应该足够了先发,但缺少在包内搜索或通过属性(来自前面的子弹)最终会咬你一口。
  • 这个安全方案甚至不够简单。要对所有用户的部署/删除进行一次身份验证,只需要一个API密钥。职责分离呢?有些用户应该只能阅读,有些用户只能用元数据进行注释(在我前面的示例中测试兼容性的QA团队),而只有一小部分用户——部署。孤注一掷的方案肯定是不够的。
  • 存储格式不理想:
    • 包以一种简单的格式存储在文件系统中。适合于小型存储库但随着业务的增长,您会希望存储更适合二进制文件。
    • 元数据没有索引。再一次,罚款小回购在美国,在规模化方面的问题是可以预见的。

所以,有没有一个好的替代NuGet远程饲料作为您的内部画廊NuGet包?我们,骄傲的制造者Artifactory,相信有:

满足Artifactory
Artifactory是一个企业级二进制存储库这集中了管理软件二进制文件的所有方面。这意味着我们要解决上面提到的所有问题。我们正在开发自2006年以来Artifactory。被数百万用户用于存储、共享和管理二进制文件,我们从用户那里收集了大量反馈。
这就是我们了解到的:

  • 二进制包与源包不同(因为它很大并且是二进制的),因此值得进行智能存储。
  • 二进制包通常是档案(无论是罐子,拉链,rpmnupkgs).它们应该是可浏览和搜索的,而不需要下载到本地开发人员的机器
  • 大型的公共存储库存在于网络上,他们需要这样做代理巧妙地(变化、审计、管理)
  • 用户有不同的口味。它们的权限应该与可能的职责相匹配(在二进制包的情况下,它们与其他情况不同)。
  • 一个二进制存储库保存着关键信息,它应该是坚如磐石的,有备份的,并且准备好了DRP。
  • 你的软件最终是一个包。我们知道如何帮助你…
    • 构建它以可复制的方式与您的构建工具和构建服务器集成。
    • 阶段它保证了最好的质量。
    • 分发给你的顾客。

通过观看,你可以了解Artifactory背后的要点这个2.5分钟的YouTube视频.如果你没心情看电影(或者爆米花吃完了),这里有快速回顾(点击图片查看完整尺寸):

NuGet毫无价值的

正如您所看到的,开发人员不是使用许多NuGet提要(NuGet Gallery, Orchard Gallery,来自同事和不同团队的远程提要),而是只使用一个存储库。它简化了设置和日常工作,集中管理和维护。
工作是双向的,用户从Artifactory解析他们的第三方依赖关系,并将他们创建的包部署到Artifactory中。
现在让我们添加一个构建服务器到图片中(字面意思):

NuGet构建

是的,这次用数字。所以,我们开始吧(点击图片查看完整尺寸):

  1. 开发人员在Visual Studio中从Artifactory中查找和获取新的第三方包。这些包从Artifactory下载到开发人员的机器上。如果软件包不在Artifactory中,它将在远程图库/提要中寻找它们。在开发人员机器使用已使用包的列表更新Config。
  2. 开发人员提交他们的代码和包config(而不是二进制文件)到VCS。
  3. 构建服务器(正如我已经提到的,TeamCity现在支持NuGet)接受来自VCS的更改。
  4. 它构建解决方案并将生成的工件打包为NuGet包。
  5. 在构建过程中,它从Artifactory获取所需的包。如果软件包不在Artifactory中,它将在远程图库/提要中寻找它们。
  6. 一旦构建了包,它们就会被部署到Artifactory。

Artifactory中的构建包可以被其他团队使用(作为他们的第三方依赖),通过质量保证的运行测试,甚至由最终用户运行(巧克力色FTW),所有这些都有细粒度的权限和健壮的提升过程(在不同可见性规则的存储库之间移动包)。
你知道吗?它值得一篇专门的指南博客。一旦出版,我会把它链接到这里。

假设您已经阅读到这一点,您已经了解到,从Artifactory 2.5.0版本开始,我们很自豪地为。net世界提供了完整的NuGet支持。我们可以代理任何远程NuGet提要(从NuGet图库开始,当然),我们可以托管在任何远程NuGet提要上找不到的包,我们可以托管你产生的包,我们可以在单个URL下聚合任何数量的任何类型的存储库。我们为您提供了一个了不起的UI配置您的存储库,浏览和搜索您的包。我们还提供智能存储功能,可以在二进制文件之上附加可搜索的元数据。我们可以做所有的事情云与我们SAAS版本

希望您现在已经被说服了,可能正在我们的网站上寻找下载链接(这是它顺便说一下,点击“Evalution”)。如果没有,可以尝试一下我们的现场演示.看一下nuget-画廊缓存:这是我们代理NuGet画廊的方式。您会发现一些包保存在本地;一旦您选择了一个包,您将看到关于它的各种信息:它的名称和大小,谁将它部署到Artifactory,它来自哪里(来自NuGet Gallery,自然是因为这是NuGet Gallery缓存),以及您可以对这个包执行的操作(由于匿名,选择自然是有限的)。点击树中的三角形将打开包,让你深入了解它的内容,包括从存档中下载特定的文件:

浏览nupkg

在JFrog,我们相信Artifactory是健壮、敏捷的。net依赖管理中缺失的一块拼图,它可以使开发过程比其他替代方案更容易。

我们将很高兴收到对本博客中提出的想法和/或您使用的经验的任何见解、想法和评论Artifactory一起NuGet