Questions tagged «dependency-management»

9
为什么比库文件夹更喜欢包管理器?
当我考虑静态库文件夹和程序包管理器的优缺点时,我觉得库文件夹是一种更好的方法。 我看到的带有库文件夹的优点: 无需外部工具即可管理软件包。 无需互联网连接即可构建。 更快的构建(无需软件包检查)。 更简单的环境(所需知识更少)。 我在套件管理员中看到的优点: 帮助处理复杂的依赖关系树(可以通过下载依赖关系及其所有​​依赖关系进行管理)。 帮助检查是否有可用的新版本。 业界似乎已经决定对当今构建的几乎所有产品都遵循包管理器的路径。那么,我想念什么?

6
何时应更新依赖项?
我们有两个与依赖关系有关的主要危机,它们具有两个不同的代码库(Android和一个Node.js Web应用程序)。Android存储库需要从Flurry迁移到Firebase,这需要将Google Play服务库更新为四个主要版本。我们在Heroku托管的Node应用程序中发生了类似的事情,在该应用程序中,我们的生产堆栈(cedar)已被弃用,需要升级到cedar-14。我们的PostgreSQL数据库也需要从9.2更新到9.6。 这些应用程序的每个依赖项都已经存在了将近两年的时间,而当其中的一些应用程序被弃用并且我们进入“日落”时期时,更新或替换它们一直是头疼的大问题。在过去的一个月中,我花了30多个小时来慢慢解决所有冲突和代码损坏。 显然,让事情搁置两年已经太久了。技术发展日新月异,特别是当您使用Heroku等平台提供商时。假设我们有一个完善的测试套件,以及一个像Travis CI这样的CI流程,它不需要进行很多更新工作。例如,如果某个功能在升级后被删除,而您正在使用它,则测试将失败。 应该多长时间更新一次依赖关系,或者何时应该更新依赖关系?我们进行了更新,因为我们被迫这样做,但似乎某种先发制人的方法会更好。发行次要版本时,我们应该更新吗?主要版本?每个月是否有更新?我想不惜一切代价避免发生我刚刚经历的情况。 PS-对于我的一个个人Rails项目,我使用了一项名为Gemnasium的服务,该服务可以跟踪您的依赖关系,以便可以将安全漏洞通知给您。这是一项很棒的服务,但是我们必须手动检查我提到的项目的依赖关系。

12
如何使您的第三方库保持最新状态?
假设我有一个依赖于10个库的项目,并且在项目的主干中,我可以自由使用这些库的任何版本。因此,我从最新版本开始。然后,每个这些库每月平均更新一次。现在,要使行李箱保持最新状态,则需要每三天更新一次图书馆参考。 这显然太多了。尽管通常1.2.3版是1.2.2版的直接替代品,但如果不进行测试就不会知道。单元测试还不够;如果是DB /文件引擎,则必须确保它与使用较旧版本创建的文件一起正常工作,反之亦然。如果与GUI有关,则必须目视检查所有内容。等等。 您如何处理?一些可能的方法: 如果它还没有坏,那就不要修复它。只要您在应用程序中使用它时没有发现任何问题,就可以使用当前版本的库,无论库供应商多久发布一次更新。微小的增量更改只是浪费。 经常更新以使更改保持较小。由于无论如何都需要进行某天的更新,因此最好经常进行更新,以便在易于修复的情况下及早发现任何问题,而不是跳过多个版本并让潜在的问题积累。 介于两者之间。有一个甜蜜的地方吗?

2
使用Subversion作为工件存储库而不是特定的工件管理工具
TL; DR:为什么使用Apache Archiva或Sonatype Nexus之类的东西作为工件存储库而不是Subversion? 我目前使用的构建系统有很多二进制Blob(图像,声音文件,已编译的二进制文件等),既可作为构建的输入也可作为输出。我们用于管理这些文件的系统非常临时;有些代码和代码一起被检入到Subversion存储库中,有些代码则存储在任何正式版本控制之外的其他位置。 我正在考虑将其合并,因此我们拥有一些更加自洽和易于使用的功能,并将二进制工件与代码分开。 Google告诉我,有一些可用的工件存储库(Archiva,Nexus, Artifactory …),但是从阅读的内容来看,与Subversion相比,使用它们没有任何优势。这将为我们照顾二进制文件-对于某些二进制文件已经做到了,我们只想重新排列存储库布局以将它们与代码分开-并具有明显的优势,因为我们已经拥有Subversion服务器和专业知识。 所以。与使用像Subversion这样的通用版本控制工具相比,使用专用的工件管理系统有什么优势?

4
在不同项目之间共享类或接口
我一直在寻找SO或此处的一些答案,但是没有任何结果,这就是为什么我要问你。 假设我有两个不同的项目-例如应用程序的服务器部分和客户端部分。我正在开发自己的部分,而我的朋友正在制作第二部分。但是我们两个都应该使用一些通用接口,例如Useror AccountInfo或ChangableAccount...,以确保兼容性。例如,如果客户端将用户数据发送到服务器,则服务器应在同一类上运行。接口等也是如此。此外,如果公共接口中有任何更改,则两个项目都应根据新情况调整其代码。 我现在看到的唯一解决方案是,创建一个额外的项目,在其中定义所有常见的事物。我们和我的朋友应该将此项目添加为对主项目(客户端或服务器)的依赖项。共享项目可以通过某些版本控制系统进行管理,因此我们始终处于最新状态。 您还建议什么其他解决方案?在专业应用中如何解决此类问题?

1
包含多个项目的CMake(C ++)存储库的目录组织
我想为存储在单个(git)存储库中的一组相关但独立的C ++项目的组织提供一些建议。这些项目使用CMake。 对于一个简化的示例,我们假设有两个项目A和B,A取决于B。大多数开发A的人都会通过包装系统获得B。因此,它们只能编译A。但是,我们应该允许开发人员分别或一起编译A和B(并安装)。 这是一个建议: └── Repo1 ├── CMakeLists.txt (1) ├── A │ ├── CMakeLists.txt (2) │ ├── include │ │ ├── aaa.h │ │ ├── aaaa.h │ │ └── CMakeLists.txt (3) │ └── src │ ├── aaa.cpp │ ├── aaaa.cpp │ └── CMakeLists.txt (4) ├── B │ ├── CMakeLists.txt (2) …

2
依靠传递依赖项还是显式声明它们更好吗?
我有一个这样的项目结构: My Project - Other Team's Project -Third Party Dependency My Project需要Other Team's Project到功能,都My Project和Other Team's Project要求Third Party Dependency运作。我们正在使用依赖项管理系统来管理这些。 从设计的角度来看,以My Project传递为基础更好Third Party Dependency吗?或者是更好地为双方My Project和Other Team's Project双方明确宣布,他们使用Third Party Dependency? 其他一些事情: 两个项目都必须具有的相同版本Third Party Dependency。 它不能保证,如果Other Team's Project被更新时My Project将进行测试,以确保没有中断,因为它们是由不同的团队进行管理。

2
如何正确管理C / C ++项目的依赖关系?
我有一个使用3-4个不同的开源C / C ++库的项目。 我为多个平台构建了这些库,并在我的项目中检入了针对不同平台的包含文件和静态库。 但是,我遇到了两个问题。所有这些项目都与依赖项管理有关。我正在寻找最佳实践建议。 1)我怎么知道我到底使用什么? 我没有办法获得静态库的版本。结果,我需要以某种方式跟踪我正在使用哪个版本的静态库(可能是生成它的提交的SHA)? 当我需要确定何时升级这些库时,这一点尤其重要。 2)如何复制构建? 我可能很难为特定平台构建一些特定库。我花了一段时间才弄清楚。 下次需要构建相同的库可能需要半年时间(无论出于何种原因都需要升级。但是,到那时,我绝对不会记住任何东西以及构建它的环境将早已不复存在。 3)我应该分叉这些库以获取源代码的副本吗? 这是一个较小的问题。但是,这仍然是一个问题。确保构建是可复制的(这需要源代码)是一件很高兴的事。

3
使用接口进行松耦合代码
背景 我有一个项目,该项目取决于某种类型的硬件设备的使用情况,但是只要该硬件设备执行我需要的操作,则由谁来制造该硬件设备并不重要。话虽这么说,即使两个本来应该做同样事情的设备,如果不是由同一家制造商生产的,它们也会有差异。因此,我正在考虑使用一个接口将应用程序与所涉及设备的特定制造商/型号分离开,而使该接口仅涵盖最高级别的功能。这就是我在想我的体系结构的外观: 在一个C#项目中定义一个接口IDevice。 在另一个C#项目中定义的库中有一个具体的东西,它将用来表示设备。 有具体的设备实现IDevice接口。 该IDevice接口可能具有类似GetMeasurement或的方法SetRange。 使应用程序了解具体的知识,并将具体的知识传递给利用(而非实现)IDevice设备的应用程序代码。 我非常确定这是正确的做法,因为这样我就可以在不影响应用程序的情况下更改正在使用的设备(这似乎有时会发生)。换句话说,具体的实现方式GetMeasurement或SetRange实际操作方式并不重要(设备制造商之间可能会有所不同)。 我唯一的疑问是,现在应用程序和设备的具体类都依赖于包含IDevice接口的库。但是,这是一件坏事吗? 我也看不到应用程序不需要知道设备的方式,除非设备与设备IDevice位于相同的名称空间中。 题 这似乎是实现接口以解耦应用程序与所使用设备之间的依赖关系的正确方法吗?

1
依赖性提升策略:孤立还是精心策划?
我们有很多相互依赖的应用程序和Web服务(一些面向公众的产品,一些内部和私有“后端”的一部分)。这些组件中的每一个都有4个环境(用于特定目的的服务器/节点集群): 非生产 DEV-CI建立推动变更的集成开发环境;有助于工程师解决在本地无法复制的难以发现的错误 QA -隔离的质量检查/测试环境 DEMO -为业务利益相关者提供稳定的UAT环境 生产 LIVE -我们的现场/制作环境 代码升级是:(LOCAL开发人员的机器)=> DEV=> QA=> DEMO=> LIVE。 假设我们有一个名为的应用程序myapp,该应用程序由RESTful Web服务支持,该服务myws本身由一个名为的数据库支持mydb。 目前,我们拥有我所说的“ 策划 ”推广这些依赖关系之中:在myapp-dev指向myws-dev它使用mydb-dev。同样,myapp-qa指向myws-qa使用mydb-qa。与DEMO和相同LIVE。 问题是,无论何时我进行更改,例如myapp,这都需要我也对myws和进行更改mydb。但是因为每个DEV环境都指向其依赖项的DEV环境,所以这意味着我必须同时计划和部署这些更改。此外,如果一个构建变得不稳定/损坏,它通常会使其他上游组件崩溃;例如,如果开发人员在更改时破坏了某些内容mydb-dev,则myws-dev和myapp-dev群集通常也会变得不稳定。 为了解决这个问题,我针对我所谓的“ 孤立的 ”促销策略提出了一个建议:所有组件间的依赖关系都遵循以下准则: 上游的依赖关系取决于DEMO对它们的下游依赖环境,对于所有其非生产环境的(DEV,QA和DEMO); 和 上游依赖项依赖于LIVE环境,生产环境依赖于下游依赖项 使用此约定,实际myapp-dev将指向myws-demo,而将使用mydb-demo。同样,myapp-qa也将指向myws-demo和mydb-demo。 我在这里可以找到的优势是构建稳定:DEMO特定组件的环境变得不稳定的可能性要小得多,因为DEMO没有在DEV和上进行严格的测试,代码就无法实现QA。 我可以发现这种方法的唯一缺点是,如果DEMO某个特定组件发生故障,则所有上游依赖项的所有非生产环境都将突然中断。但是我要反驳说,由于在DEV和上进行的测试,这种情况极少发生QA。 这已经得到了成为一个问题,很多开发者(比我更聪明,经验丰富)已经解决了,如果这个问题,其解决方案已经有名字给他们我不会感到惊讶(除了什么我打电话策划/孤立)。所以我问:孤立的促销策略的优点是否胜过任何缺点,在这里我可能忽略哪些缺点?

1
Node.js依赖性过大
最近,我开始玩node.js。 现在,每个节点教程都指出您应该从 npm init 然后,说您想要一些标准的服务器框架,说您选择express: npm install express 但是您会想要从ASP.NET这样的世界中获得更多习惯。 我谈论模板引擎(Jade)和样式表预处理器(SASS)。 然后他们告诉您“安装gulp / grunt!这样您就可以自动最小化和丑化并运行服务器以及许多其他东西!” 这意味着安装gulp,node-sass和gulp-sass和gulp-uglify,以及一些更酷的东西(tsd或babel,markdown等)... 但是所有这些都在您的磁盘和项目上很繁重。不要浪费时间,您可以轻松地找到该项目的100MB +磁盘大小(甚至还没有开始!),更不用说10000+个文件了,因为每个节点模块都具有自己的依赖性,无论相同依赖关系被另一个模块使用。移动到任何地方都是一件非常困难的事情,更不用说Web服务器了。 我想念什么吗?我认为,在存在如此明显的缺陷的同时,对节点环境给予如此多的赞扬是不可能的。我是否期望太多(毕竟我确实曾经尝试过一次使用许多工具),Node退伍军人知道有什么琐碎的事情可以绕过它吗?

4
您如何处理仅在运行时才知道的传递依赖冲突?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 您通常如何处理大型软件项目在运行时发生的传递依赖问题? 在过去的三个星期中,我一直试图在一个软件的另一个组件中启动一个大型软件的一个组件,但是由于仅在运行时才知道的传递依赖项问题,该软件间歇性地消失了。 通过传递依赖关系问题,我的意思是给定项目的依赖关系的某些依赖关系在运行时与其他依赖关系发生冲突,从而导致不稳定或即时失败。 有成百上千的依赖在使用中,并且与该工具相关联的子项目大约有50个,这些其他项目是由其他团队隔离进行的,其中所有模块之间都具有深层嵌套的依赖关系。鉴于项目的规模和复杂性,没人知道所有子项目的用途。 在这种情况下,您是否会尝试为受影响的组件的每个依赖项生成DAG的可视化表示,并尝试确定在运行时可能在何处发生冲突?我无法控制其他子项目中依赖项的管理方式,也无法更改其他开发人员编写的任何Java代码 我提出的解决方案只能工作一两个小时,然后由于上游组件的更改而停止工作。上游组件的一个示例是工件,我正在处理的项目依赖于工件,该工件是在CI管道的较早阶段构建的。 应他人的要求,我将提供有关正在使用哪种技术的信息,可能会因提供太多信息而导致问题被解决,或者身体变得太长的风险: Maven用于依赖性管理;和 Spring用作DI容器; 由于在运行时加载了其他模块的上下文,因此大多数依赖性问题都涉及到重叠的Bean上下文。 该产品运行正常,并且存在大量的单元测试和集成测试,以确保程序的功能正确性 总的来说,我正在寻找一种与语言无关的方法来确定解决依赖冲突的方法,而不用枚举给定项目依赖的所有可能组合。 我无法重新设计项目,添加其他质量保证,无法推动公司范围内的范式转换或切换语言作为解决方案。

1
为什么Apache有两个分别用于构建和依赖管理的工具?
Apache有两个单独的工具: 阿帕奇Maven Apache Ant + Apache Ivy 他们似乎都填补了相同的利基。我有两个问题: 两种工具之间的主要区别有哪些亮点? 我确信可以写一篇很长的文章,探讨两者之间的区别,我不是在寻找太多细节,也不是在寻找一个主观的论点来选择一个。 编程的历史-Apache如何演变为创建两组完全独立的工具,这些工具最终在目的上如此相似?

3
我该如何为“依赖管理”辩护?
我目前正在尝试为构建(ala Maven,Ivy,NuGet)采用依赖管理,并为共享模块创建内部存储库,我们在十几个企业范围内。这种构建技术的主要卖点是什么?到目前为止,我有: 简化了分发和导入共享模块的过程,尤其是版本升级。 要求精确记录共享模块的依赖性。 从源代码管理中删除共享模块,加快并简化检出/检入(当您的应用程序具有20多个库时,这是一个实际因素)。 使您可以更好地控制或了解组织中使用了哪些第三方库。 我有没有卖点?是否有研究或文章提供改进指标?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.