.net 如何管理生成服务器上自动生成的依赖关系?

.net 如何管理生成服务器上自动生成的依赖关系?,.net,build,msbuild,continuous-integration,dependency-management,.net,Build,Msbuild,Continuous Integration,Dependency Management,我正在尝试将持续集成到我们的日常工作中。 在我们的团队中,我们正在从仅在工作站上的Visual Studio中构建代码并进行部署,转向使用MSBuild.exe并在构建服务器(即Jenkins)上实现自动化,而不使用Visual Studio 在我们的项目中,我们对Automap等引用具有外部依赖性。由于自动映射(例如)dll不在生成服务器上,msbuild执行失败的原因显而易见。还有其他dll,我需要成为构建的一部分,我只是以automap为例 那么,作为自动构建的一部分,将任何依赖关系获取到

我正在尝试将持续集成到我们的日常工作中。 在我们的团队中,我们正在从仅在工作站上的Visual Studio中构建代码并进行部署,转向使用MSBuild.exe并在构建服务器(即Jenkins)上实现自动化,而不使用Visual Studio

在我们的项目中,我们对Automap等引用具有外部依赖性。由于自动映射(例如)dll不在生成服务器上,msbuild执行失败的原因显而易见。还有其他dll,我需要成为构建的一部分,我只是以automap为例

那么,作为自动构建的一部分,将任何依赖关系获取到构建服务器上的最佳方法是什么?我看到过使用“lib”文件夹的引用,但我真的不明白应该把它放在哪里(在我的项目、文件系统、SVN…?),以及构建服务器将如何到达它。我还读到NuGet可以处理依赖项,但我的构建服务器没有连接到internet,我不明白如何让我的构建拉取我可能创建的NuGet包,以及它是如何协同工作的


编辑:我使用的是subversion,我们不能使用TeamCity,因为我们必须购买它,而且没有任何融资机会。

您应该详细阅读NuGet,因为它允许您设置内部软件包存储库


无论您的系统多么优雅,您的第一个目标应该是让CI运行。在构建系统时,“lib目录”选项通常是最简单的。将二进制文件签入Subversion。这很难看,但它让你开始,你的构建水平将是可复制的,这是必须的。工作完成后,研究并选择适合您需要的外部依赖版本控制系统(可能是Nuget)


作为补充说明,请详细检查TeamCity的免费部署是否对您无效。上次我检查时,您必须有大量的协调项目或大量的构建代理才能要求许可证。

我们运行SVN+CCNet。我们有一个用于第三方库的SVN存储库,如下所示:

/foo/foo-1.2.3
/foo/foo-1.4.0
/bar/bar-1.0.0
foo https://svn-server/3rdparty/foo/foo-1.4.0
也就是说,每个库有一个目录,每个可用版本有子目录

一条规则是,目录必须包含原始库-即,您解压缩并提交,不允许修改

当您的项目中需要一个库时,您可以添加一个lib目录,并用第三方存储库中指向库的链接(svn:externals)填充它。重要的是,本地目录名中不包含版本号。如果需要foo-1.4.0,lib目录上的svn:externals链接如下所示:

/foo/foo-1.2.3
/foo/foo-1.4.0
/bar/bar-1.0.0
foo https://svn-server/3rdparty/foo/foo-1.4.0
i、 它以/lib/foo结尾。这样升级版本就容易多了,因为您所要做的就是更改svn:externals链接以指向新版本,并且(只要文件名没有更改)所有项目都将自动获得它并可编译

至于努吉。。麻烦多得不值,但意见不同:)


希望这会有所帮助

我喜欢stmax的解决方案,但在这一点上对您来说可能有点太多的工作


最简单的方法是在存储库中创建一个lib目录,并将所有第三方程序集添加到该目录中更新所有项目以引用此库目录中的第三方程序集。把一切都登记好。当构建服务器醒来进行下一次构建时,它将获取最新的更改,其中包括新的lib目录和项目引用更改。绿色建筑

看一看:我是直接从存储库本身(这可能吗?)还是在签出后从开发人员工作站上的工作副本中的lib文件夹更新对第三方程序集的引用?如果是前者,我是否需要为此使用svn:externals?@TomPickles您可以更新它们以引用工作副本中lib文件夹中的程序集。Visual Studio使用相对路径作为引用,因此它们将在签出存储库的每台计算机上工作。+1这几乎正是我们管理第三方库的方式。唯一的区别是我们称之为Externals,而不是LibStmax,除了你说的,我过去还有一个名为/foo/Latest的额外文件夹,它指向其他文件夹之一,例如/foo/foo-1.6.0。这允许通过控制文件夹的内容来更新引用。然后,您可以进行一些控制,以便在多个项目/团队与dll的多个版本不发生冲突时。