在源代码控制中存储第三方库
应用程序依赖的库应该存储在源代码pipe理中吗? 我的一部分说,应该和另一部分说不。 感觉不对,因为你依赖于它的一些function(尽pipe很重),添加一个20MB的库,使整个应用程序相形见绌。 你应该只存储jar / dll,或者甚至是项目的分布式zip / tar?
其他人做什么?
除了在存储库中拥有第三方库之外,还应该以这种方式进行操作,以便轻松跟踪和合并将来的库更新(例如安全修补程序等)。 如果你使用Subversion使用正确的供应商分支是值得的。
如果你知道这将是一个寒冷的一天,然后你会修改你的第三方代码(正如@Mat Sheppard所说),外部是有道理的,给你额外的好处,它变得很容易切换到该库的最新版本应该是安全更新或必须具备的新function。
另外,如果需要更新代码库,则可以跳过外部存储。
@Stu Thompson在源代码控制中提到存储文档等。 在更大的项目中,我将所有“客户”文件夹存储在源代码控制中,包括发票/账单/会议纪要/技术规格等。整个拍摄比赛。 虽然,嗯,记得把它们存储在一个SEPARATE仓库中,这个仓库可以提供给其他开发者。 客户端; 你的“浏览器源视图”…咳嗽… 🙂
存储所有你需要build立这个项目从现在起10年。我存储的任何图书馆的整个邮编分配,以防万一
编辑2017年:这个答案没有老化:-)。 如果你还在使用像ant这样的老东西,那么上述内容仍然适用。 如果您使用maven或graddle等更现代的东西(例如.net上的Nuget),则使用依赖pipe理,除了版本控制服务器外,您还应该运行依赖pipe理服务器。 只要你有良好的备份,你的依赖pipe理服务器不会删除旧的依赖关系,你应该没问题。 有关依赖pipe理服务器的示例,请参阅Sonatype Nexus或JFrog Artifcatory等。
不要存储这些库; 他们不是严格地说你的项目的一部分,无用在你的修订控制系统占用的空间。 但是,不要使用maven (或者ant版本的常青藤 )来跟踪项目使用的外部库的版本。 您应该在您的组织中运行一个回购镜像(已备份),以确保始终拥有您所控制的依赖关系。 这应该给你两全其美的; 外部jar子在您的项目之外,但仍然可靠和集中访问。
我们将库存储在源代码控制中,因为我们希望能够通过简单地检查源代码并运行构build脚本来构build项目。 如果你无法获得最新的信息,只能一步到位,那么你以后只会遇到问题。
切勿将您的第三方二进制文件存储在源代码pipe理中 源代码控制系统是支持并发文件共享,并行工作,合并和改变历史的平台。 源代码pipe理不是用于二进制文件的FTP站点。 第三方程序集不是源代码; 他们可能每SDLC更改两次。 希望能够清理干净的工作空间,从源代码控制和构build中拉下所有东西,并不意味着第三方程序集需要被控制在源代码中。 您可以使用构build脚本来控制从分发服务器中提取第三方程序集。 如果您担心控制应用程序的哪个分支/版本使用特定的第三方组件,那么您也可以通过构build脚本来控制它。 人们提到了Maven for Java,你可以用MSBuild做类似于.Net的工作。
我通常将它们存储在存储库中,但我同情你的意愿,以保持规模。
如果你不把它们存储在存储库中,绝对需要以某种方式进行存档和版本化,而你的构build系统需要知道如何获取它们。 Java世界中的许多人似乎使用Maven自动获取依赖关系,但是我没有使用I,所以我不能真正推荐或反对它。
一个好的select可能是保留一个单独的第三方系统的存储库。 如果你使用的是Subversion,那么你可以使用Subversion的外部支持来自动从其他仓库中检出这些库。 否则,我build议保留一个内部的匿名FTP(或类似的)服务器,你的构build系统可以自动从中获取需求。 显然你要确保你保留了所有旧版本的库,并且把所有的东西都和你的仓库一起备份。
我所拥有的是一个内联网的Maven类存储库,其中存储了所有第三方库(不仅包括库,还包括它们各自的源文件分发包,Javadoc以及所有内容)。 原因如下:
- 为什么将不改变的文件存储到专门devise用于pipe理文件更改的系统中?
- 它大大加快了结账
- 每次我看到“源代码.jar”存储在源代码pipe理下,我问“它是哪个版本?”
我的首选是将第三方库存储在一个依赖库(例如使用Maven的 Artifactory )中,而不是保存在Subversion中。
由于第三方库不像源代码那样进行pipe理或版本化,因此混淆它们没有多大意义。 远程开发人员也非常喜欢不必通过慢速WPN链接下载大型图书馆,因为他们可以从任何数量的公共存储库更容易地获得它们。
我把除了JDK和IDE之外的所有东西放在源代码控制中。
托尼的哲学是健全的。 不要忘记数据库创build脚本和数据结构更新脚本。 在维基出来之前,我曾经甚至将我们的文档存储在源代码控制中。
在以前的雇主中,我们存储了在源代码控制中构build应用程序所需的一切。 旋转一个新的生成机器是一个同步源代码pipe理和安装必要的软件的问题。
将第三方库存储在源代码pipe理中,以便在您将代码检查到新的开发环境时可用。 任何“包含”或构build命令,你可能在构build脚本也应引用这些“本地”的副本。
除了确保您所依赖的第三方代码或库始终可供您使用,还意味着当新开发人员join团队时,(几乎)可以使用新的PC或用户帐户构build代码。
使用git子项目,以及来自第三方库的主git仓库的引用,或者(如果没有的话)为每个需要的库创build一个新的git仓库。 没有任何理由说明为什么你只能使用一个git仓库,而且我不推荐你把别人的项目作为你自己的目录。
存储库! 存储库应该是任何时候构build项目所需要的快照。 由于项目需要不同版本的外部库,因此您需要更新/检入这些库的较新版本。 这样你就可以得到所有正确的版本去旧的快照,如果你不得不打补丁旧版本等
存储所有你需要build立的项目,所以你可以检查出来,并build立没有做任何事情。
(作为一个经历过痛苦的人 – 请保留一份安装控件并在开发平台上工作所需的所有东西,我曾经有一个可以构build的项目 – 但没有安装文件和registry项,不会对第三方控件布局做任何改动,这是一个有趣的改写)
你必须存储你需要的所有东西来构build项目。 此外,不同版本的代码可能对第三方有不同的依赖关系。 你会想把你的代码和第三方的依赖关系一起分解成维护版本。
就我个人而言,我有一个依赖文件夹作为我的项目的一部分,并在那里存储引用的库。
我发现这让我的工作变得更容易,因为我在很多不同的项目上工作,通常需要相同版本的库的相互依赖的部分,这意味着更新到给定库的最新版本并不总是可行的。
在编译时使用每个项目的所有依赖关系意味着,在事情发生的几年之后,我仍然可以构build项目的任何部分,而不用担心打破其他部分。 升级到一个新版本的库只是一个replace文件和重build相关组件的情况,如果需要的话不难pipe理。
话虽如此,我发现我提到的大多数库都是相当小的,大概在几百kb,很less更大,这使得我们只把它们放在源代码pipe理中就不是什么问题。
就个人而言,我已经做了,迄今为止喜欢的结果是存储库在一个单独的存储库,然后通过使用Subversion svn:externalsfunction链接到我需要在我的其他存储库中的每个库。 这很好,因为我可以在源代码控制中保留大部分库(主要是托pipe的.NET程序集)的版本化副本,而根本不需要增加主源代码库的大小。 以这种方式将程序集存储在存储库中使得构build服务器不必安装它们就可以进行构build。 我会说,在没有安装Visual Studio的情况下获得构build成功相当麻烦,但现在我们得到了它的工作,我们很高兴。
请注意,我们目前没有使用许多商业的第三方控制套件或类似的东西,所以我们没有遇到可能需要在生成服务器上实际安装SDK的许可问题,但是我可以看到在哪里很容易成为一个问题。 不幸的是我没有解决scheme,并计划在我第一次遇到它时解决它。