npm 安装git代码
在多个存储库,monorepos和微服务之间,关于在项目之间共享通用代码的讨论越来越激烈。
在项目和存储库之间共享通用代码是实现更好的模块化和更快的开发的关键因素,但是它也很复杂 。 我之前已经写过有关它的文章 ,并根据我们自己的团队经验进行了分享。
这是在2018年在这些回购协议和项目之间共享代码的5种方法的实用概述。请记住,这实际上是关于人与人之间的交流,文化和牢记模块化的 。
1.位
Bit将新发现的“ 简单性”和“ 可扩展性”引入了代码共享 ,因为您的整个团队可以协作并轻松地在项目之间共享代码。
这是一个开源项目和一个组件平台 ,它们共同帮助团队将可重用的代码单元转换为共享组件。
Bit具有自动的依赖欺骗和解析机制,可让您自动将可重用与您的任何JS项目隔离。 这有助于Bit使组件可重用,而零重构需要。
然后,您可以重用其他项目中的组件(使用NPM / Yarn或Bit本身),甚至可以开发和同步不同存储库之间的更改。
“魔术”在于这样一个事实,即Bit不仅处理软件包。 它处理不同项目中的源代码组件。 这意味着它可以在任何地方隔离,更新和同步组件,因此您可以轻松共享更多代码。
Bit还可以为您共享的组件提供发现性和协作性,这些共享性在平台的可视化集合中进行组织,包括按组件进行的测试,构建,可视化渲染等。
Bit的“缺点”是,要使用NPM / Yarn客户端安装代码,您必须将开放的Bit集线器配置为Scoped注册表。
2.带有/不带有Lerna的NPM
NPM发生在JavaScript上是一件了不起的事情,它为代码重用和可重用模块和库之间的协作打开了大门。 关于这个生态系统的所有抱怨,我们无法想象没有它的生活。
您可能已经对NPM有所了解,所以让我们集中讨论一些限制以及如何克服它们。 从一开始就做出明智的选择可以节省以后的时间。
首先,很难为许多软件包设置和维护许多存储库。 因此,某些项目被构建为多包存储库,也称为“ monorepos”。 Bit和Lerna(如下所示)之类的工具可以帮助您将项目变成多包存储库,您可以在此处了解更多信息 。
这也导致许多团队选择共享库作为共享许多较小组件的解决方案(见下文),因为很难为每个组件都提供一个软件包。
其次,当其他人发布软件包时,您开发软件包的能力有限,通常会导致对软件包回购的拉动请求。 Bit之类的工具可帮助缓解此问题,因为它使您可以将组件直接带入任何存储库,进行更改并共享新版本。
第三,扩展规模时存在可发现性问题。 很难从许多小包装中找到和选择,这会导致Wiki网站和冗长的文档。 汇总的作者Rich Harris 写 :
“已经创建了许多博客文章(从头开始,整个网站),以减轻在npm上找到所需内容的困难……”
“由您来评估库:它是否有测试? 你能看懂源代码吗? 是否积极维护? 文档易于查找和参考吗? ”
莱娜
将不同的程序包保存在不同的存储库中可能很快就会失控,并且很难在整个项目中更新更改。
Lerna帮助您在单个存储库中保留和配置多个软件包。 它可以帮助减轻针对不同程序包的不同存储库的麻烦,并有助于构建和测试整个项目。 这样,您不必为不同的软件包保留和维护单独的存储库。
要了解有关进行monorepo的更多信息,请查看以下内容:
3.共享库和公用库
共享库的优点是您可以将所有共享代码保存在一个存储库中,这比多个微包更易于维护和分发。 但是,与Lerna monorepos不同,它们将作为一个包装使用。
将所有共享代码都保存在一个存储库中,会迫使用户使用冗余代码,依赖项,复杂性和权重将整个库添加到他们的项目中,而所有这些都只能使用一个组件。
这也使更新和修改过程变得非常繁琐,因为每次更改都需要项目的所有者来更新软件包。 这可能会损害组织内部对这些库的采用 。 库中不同组件的可发现性也是一个问题。
这些问题导致Lodash之类的社区长期努力工作,以便将其组件作为单独的软件包 发布到NPM。 Google的Polymer项目 (由Eric Bidelman和其他OSS向导编写 )也将100多个Web元素保存在100多个存储库中。
Lerna可用于将库中的组件分离成仓库中的包。 该位可用于共享现有库中的组件。
例:
作为React组件的基础-24个Javascript组件。 例如:switch,menu,flex-video,progress-bar… bitsrc.io
4. Git子模块
Git是大多数开发团队的首选SCM。 它允许您将一个存储库作为另一个存储库的子目录 ,为整个项目创建一个工作树 ,并且一个项目可以使用另一个项目中的代码。
Git的子模块存在各种问题。 首先,它们仅在master
分支上工作。 其次,子模块会在各个项目之间创建高度耦合的代码,从而使得难以在跨仓库任务上进行合并和协作。 子模块存储库也不知道它是嵌套的,并且可能具有从属存储库。
有多种工具可提供围绕Submodule功能的附加自动化功能,例如git-subtree , gitslave , braid和giternal 。 这些工具试图改善子模块的某些可用性问题,但不受特定供应商的支持,并且具有不同的缺点。
5.复制粘贴代码
因为面对现实,未来的我曾经为我做什么?
老实说,这也许是地球上代码“重用”的最常用实践。 我想认为,在大多数情况下,这是由于缺乏“便宜”的有效替代方案以及交付周期有些混乱的结果。
问题是,代码复制一点都不便宜。 离得很远。
复制是代码库中不断增加的债务。 您将很快失去控制,使维护成为一场噩梦,交货周期将更长。 许多问题只有在交付生产后才会发现。
最近的一项研究发现GitHub上的一半代码是重复的 。 我们的研究发现,仅在10,000个GitHub存储库中,就可以将类似is-string
的Javascript函数复制到100个不同实现的1000多次重复中。
考虑一下如果更多的人共享代码而不是重复或重新实现代码,可能会编写的新功能。 考虑组织的维护成本和较长的交付周期。
共享代码是关于人的
每个项目和每个开发人员都有自己的关注点,工具和工作流程。 尽管如此,共享代码仍是实现真正模块化的关键,模块化在当今的生态系统中变得越来越流行,并提供了巨大的优势。
我们选择构建Bit 。 无论选择哪种方法和工具,重要的是要鼓励一种孕育共享和协作的文化。
毕竟,项目之间的共享始于人与人之间的共享。
学到更多
翻译自: https://hackernoon.com/5-practical-ways-to-share-code-from-npm-to-lerna-and-bit-732f2a4db512
npm 安装git代码