我们使用Nuget进行内部开发,以便在团队之间共享代码。然而,当一个人同时处理跨多个nuget包部署的代码时,我们会遇到问题。例如
A依赖于B,而B依赖于C。
A、B和C将它们的工件推到Nuget,这就是我们如何管理A、B和C之间的依赖关系的方法。我们发现的问题是,如果开发人员想在C中进行更改,并且快速地看到这些变化在A中反映,那么它们必须经过以下过程。
这似乎非常痛苦,并导致我们的一些开发人员质疑Nuget在我们内部开发的代码中的选择。每个人仍然喜欢它消费外部包。
是否有更好的内部使用Nuget的工作流?
发布于 2013-08-12 04:16:34
在我们公司,我们已经用下面的设置解决了级联更新问题。首先,我们为我们的NuGet存储库和构建服务器设置了下面的设置。
<MAJOR>.<MINOR>.<BUILD>.<REVISION>,那么开发人员只能更改主版本号、次版本号和版本号,修订号被设置为0,除非生成服务器所做的构建是生成的版本号。这一点很重要,因为这意味着对于由主、次要和生成编号组成的给定版本,构建服务器总是会生成更高的版本号。这同样意味着NuGet将更愿意接受来自公司包存储库的包版本(它只通过构建服务器获取包)。为了对其中一个基本库进行更改,需要使用两个可能的进程。第一个过程是:
如果需要对(A)进行更多更改,则重复步骤1、2和3,然后从(B)的工作目录中删除(A)的包。下次构建运行时,NuGet将查找(A)的特定版本,在本地机器存储库中找到它,并将其拉回来。请注意,NuGet缓存可能会在某些时候阻止这个过程,尽管看起来NuGet可能不会缓存来自同一台计算机(?)的包。
一旦更改完成,那么我们:
进行开发工作的另一种方法是采取以下步骤
c:\mysource\projectB\packages\ProjectA.1.2.3.4)提交过程仍然相同,需要首先提交项目(A),在项目(B)中,需要升级对(A)的NuGet引用。
第一种方法稍微整洁一些,因为这个过程还警告如果(A)的NuGet包中有错误(例如忘记添加一个新的程序集),而在第二个过程中,开发人员直到(A)包发布之后才知道。
发布于 2013-08-11 13:09:33
你在这里有两个选择:
我使用了这两种方法,而#1是一个合理的选择,但NuGet Galley是为nuget.org优化和设计的,而不是在前提/企业中使用,因此删除包之类的事情是痛苦的(手动使用SQL )。
我想说的是,你应该支付Artifactory Pro的(低)许可费-这是一个优秀的产品,JFrog团队真的很热衷并打开了。
您不应该对内部/企业包使用nuget.org;nuget.org是为第三方/开源库设计的,而不是内部构建依赖关系。
编辑:在工作流方面,为什么要将共享的代码放入多个包中?如果代码需要共享,那么它需要放在自己的单独包中。
编辑2:为了加快开发人员的代码更改工作流,可以使用nuget.exe (命令行客户端)和命令行可访问的构建,这样就可以针对" developer“构建运行。然后,在您的"developer“构建(与CI构建相反)中,当您希望将新更新的-Source作为依赖项并对其进行构建时,将nuget install B -Source C:\Code\B指定为本地路径(例如nuget install B -Source C:\Code\B);同样,对于C或其他本地更新的包也是如此。然后,当A、B和C都构建得很好时,您可以对它们进行git push (按反向依赖顺序),并让CI完成它的工作。
但是,如果您必须经常进行这个构建“舞蹈”,那么您还应该质疑包分离是否真的合适,因为这意味着所有代码都应该在一个包中,或者可能在不同的包中沿着不同的线分开。定义良好的包的一个关键特性是,它不应该对其他包造成连锁反应,如果您正在有效地使用语义版本化,那么当然不会。
编辑3 marcelo所要求的一些澄清:“命令行可访问的构建”是完全可以在命令行中进行的构建,而不需要使用Visual,通常是通过批处理文件。"developer build“是一个开发人员从她的工作站运行的构建,而不是在CI服务器上运行的CI构建(这两个构建应该本质上是相同的)。
发布于 2014-08-05 22:27:41
如果A、B和C采用相同的解决方案,则可以在单个构建中为它们创建NuGet包。
只需确保使用包具有它所依赖的包的新版本号(假设您的构建没有随机更改它)。
如果A、B和C有意采用不同的解决方案,例如A在基础结构解决方案下,B在产品解决方案下,那么我对您的唯一建议是定义您的CI构建在签入时运行,而不是定期运行。
编辑:
另一种选择是在本地构建期间向您的服务器创建一个push 预发布包(例如1.0.0-alpha版本),这样开发人员就可以在创建发布版本之前对该包进行实验。
https://stackoverflow.com/questions/18113223
复制相似问题