在多个存储库,monorepos和微服务之间,关于在项目之间共享通用代码的讨论越来越激烈。

在项目和存储库之间共享通用代码是更好的模块化和更快的开发的关键因素,但是它也很复杂 。 我之前已经写过有关它的文章 ,并根据我们自己的团队经验进行了分享。

这是在2018年在这些回购协议和项目之间共享代码的5种方法的实用概述。请记住,这实际上是关于人与人之间的交流,文化和牢记模块化的 。

1.位

Bit将新发现的“ 简单性”和“ 可伸缩性”引入了代码共享 ,因为您的整个团队可以协作并轻松地在项目之间共享代码。

这是一个开源项目和一个组件平台 ,它们共同帮助团队将可重用的代码单元转换为共享组件。

Bit具有自动的依赖欺骗和解析机制,可让您自动将可重用与您的任何JS项目隔离。 这有助于Bit使组件可重用,而零重构需要。

然后,您可以重用其他项目中的组件(使用NPM / Yarn或Bit本身),甚至可以开发和同步不同存储库之间的更改。

“魔术”在于这样一个事实,即Bit不仅处理软件包。 它处理不同项目中的源代码组件。 这意味着它可以在任何地方隔离,更新和同步组件,因此您可以轻松共享更多代码。

位-使用代码组件共享和构建
使用Bit可以轻松有趣地构建带有较小组件的软件,与团队共享它们并在您的计算机中同步它们。

Bit还为您共享的组件提供了发现性和协作性,这些共享性被组织在平台的可视化集合中,并进行了逐项测试,构建,可视化渲染等。

这是一个示例React项目和一个匹配的组件集合 。

Bit的“缺点”是,要使用NPM / Yarn客户端安装代码,您将必须将开放的Bit集线器配置为作用域注册表。

teambit /位
与您的团队轻松地在项目之间共享代码。 -teambit /位 github.com

2.带有/不带有Lerna的NPM

Sindre Sorhus具有1000 NPM软件包

NPM发生在JavaScript上是一件了不起的事情,它为代码重用以及可重用模块和库之间的协作打开了大门。 关于这个生态系统的所有抱怨,我们无法想象没有它的生活。

您可能已经对NPM有所了解,所以让我们集中讨论一些限制以及如何克服它们。 从一开始就做出明智的选择可以节省以后的时间。

Dan Abramov支持许多模块

首先,很难为许多软件包设置和维护许多存储库。 因此,某些项目被构建为多包存储库,也称为“ monorepos”。 Bit和Lerna之类的工具(见下文)可以帮助您将项目转换为多包存储库,您可以在此处了解更多信息 。

这也导致许多团队选择共享库作为共享许多较小组件的解决方案(见下文),因为很难为每个组件都提供一个软件包。

其次,当其他人发布软件包时,您开发软件包的能力有限,通常会导致对软件包回购的拉动请求。 Bit之类的工具可帮助缓解此问题,因为它使您可以将组件直接带入任何存储库,进行更改并共享新版本。

第三,扩展规模时存在可发现性问题。 很难从许多小包装中找到和选择,这会导致Wiki网站和冗长的文档。 汇总的作者Rich Harris 写到 :

“已经创建了许多博客文章(从头开始,整个网站),以减轻在npm上找到所需内容的困难……”

由您来评估库:它是否有测试? 你能看懂源代码吗? 是否积极维护? 文档易于查找和参考吗?

莱娜

莱娜的九头蛇:看着它的尾巴,我想它会掉下来

将不同的程序包保存在不同的存储库中可能会很快失控,并且很难在整个项目中更新更改。

Lerna帮助您在单个存储库中保留和​​配置多个软件包。 它可以帮助减轻针对不同程序包的不同存储库的痛苦,并有助于构建和测试整个项目。 这样,您不必为不同的软件包保留和维护单独的存储库。

要了解有关进行monorepo的更多信息,请查看以下内容:

Monorepos变得更简单
有无Lerna和朋友时,如何利用Bit + NPM简化monorepo体系结构。 blog.bitsrc.io

3.共享库和公共库

共享库的优点是,您可以将所有共享代码保存在一个存储库中,比多个微包更易于维护和分发。 但是,与Lerna monorepos不同,它们将作为一个包使用。

将所有共享代码都保存在一个存储库中,会迫使用户使用冗余代码,依赖项,复杂性和权重将整个库添加到他们的项目中,而所有这些都只能使用一个组件。

一个React MaterialUI按钮组件—我真的需要一个完整的库吗?

这也使更新和修改的过程非常繁琐,因为每次更改都需要项目的所有者来更新软件包。 这可能会损害组织内部对这些库的采用 。 库中不同组件的可发现性也是一个问题。

这些问题导致Lodash之类的社区长期努力工作,以便将其组件作为单独的软件包 发布到NPM。 Google的Polymer项目 (由Eric Bidelman和其他OSS向导编写 )也将100多个Web元素保存在100多个存储库中。

Lerna可用于将库中的组件分离成仓库中的包。 该位可用于共享现有库中的组件。

例:

digiaonline /反应基础
作为React组件的基础。 通过在… github.com 上创建一个帐户为digiaonline / react-foundation开发做出贡献
digiaonline的反应基础·位
作为React组件的基础-24个Javascript组件。 例如:switch,menu,flex-video,progress-bar… bitsrc.io

4. Git子模块

Git是大多数开发团队的首选SCM。 它允许您将一个存储库作为另一个存储库的子目录 ,为整个项目创建一个工作树 ,并且一个项目可以使用另一个项目中的代码。

在战trench中汲取的教训?

Git的子模块存在各种问题。 首先,它们仅在master分支上工作。 其次,子模块会在各个项目之间创建高度耦合的代码,从而难以在交叉仓库任务上进行合并和协作。 子模块存储库也不知道它是嵌套的,并且可能具有从属存储库。

有多种工具可提供围绕Submodule功能的附加自动化功能,例如git-subtree , gitslave , braid和giternal 。 这些工具试图改善子模块的某些可用性问题,但不受特定供应商的支持,并且具有不同的缺点。

5.复制粘贴代码

因为面对现实,未来的我曾经为我做什么?

当你的队友对YOLO大喊大叫

老实说,这也许是地球上代码“重用”的最常用实践。 我想认为,在大多数情况下,这是缺乏“廉价”有效替代方案以及交付周期有些混乱的结果。

问题是,代码复制一点都不便宜。 离得很远。

未来我的经典问题。

重复是代码库中不断增加的债务。 您将很快失去控制,使维护成为一场噩梦,交货周期将越来越长。 许多问题只有在交付生产后才会发现。

最近的一项研究发现GitHub上的一半代码是重复的 。 我们的研究发现,仅在10,000个GitHub存储库中,就对100种不同实现的1000多个重复项进行了复制,例如is-string这样的Javascript函数。

考虑一下如果更多的人共享代码,而不是重复或重新实现代码,可能会编写的新功能。 考虑组织的维护成本和较长的交付周期。

共享代码是关于人的

每个项目和每个开发人员都有自己的关注点,工具和工作流程。 尽管如此,共享代码仍是实现真正模块化的关键,模块化在当今的生态系统中变得越来越流行,并提供了巨大的优势。

我们选择构建Bit 。 无论您选择哪种方法和工具,都必须鼓励一种孕育共享和协作的文化。

毕竟,项目之间的共享始于人与人之间的共享。

学到更多

5个用于在React中加快开发速度的工具
5个用于加快React应用程序开发速度的工具,重点关注组件。 blog.bitsrc.io
使用Bit和NPM轻松实现Monorepos
如何利用位+ NPM进行单存储,而不会产生任何开销。 blog.bitsrc.io
使用React和Bit进行原子设计:简化复杂的UI
使用带有React + Bit的Atomic Design简化复杂的UI。 blog.bitsrc.io

From: https://hackernoon.com/5-practical-ways-to-share-code-from-npm-to-lerna-and-bit-732f2a4db512

5种共享代码的实用方法:从NPM到Lerna,Git子模块和位相关推荐

  1. 我的《一种前端代码质量检测方法及装置》专利申请

    今天比较高兴的事情是我申请的一个专利结果下来了,公司奖励虽然不多就一千,但是很激动,因为代表了自己的一个小里程碑,哈哈

  2. 投稿前,如何查询期刊投稿周期,4种亲测有效实用方法

    当开始投稿文章到期刊的时候,我们便开始了对审稿周期的猜测. 究竟需要等多长的时间,稿件才能通过审核,并成功录用. 投稿后那些"望眼欲穿"的日子真是难熬-- 不少同志自从投稿以后几乎 ...

  3. 6种快速统计代码执行时间的方法,真香!(史上最全)

    我们在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Jav ...

  4. java sleep方法_6种快速统计代码执行时间的方法,真香!(史上最全)

    我们在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Jav ...

  5. 西门子博图怎么导入库文件_如何在博途环境下使用库文件来共享代码?

    在一个大型项目的开发中,往往会有一些重复的代码.比如,需对生产线上的10台行走电机进行控制,而其控制的方式是相同的.如果对每一台电机都分别写控制程序,就会出现大量的重复代码. 为了减少代码重复编写造成 ...

  6. 必读|提高代码阅读能力的七种实用方法

    ↑ 点击上方蓝字关注我们,和小伙伴一起聊技术! 随着越来越多的公司使用敏捷开发,能够阅读别人的代码比以往显得更重要.这就需要学习一些如何提高这项技能的技巧.本文提供了7种提高代码阅读技巧的方法,以下是 ...

  7. 独家 | 数据科学家对可复用Python代码的实用管理方法(附链接)

    作者:Matthew Mayo, KDnuggets翻译:殷之涵校对:欧阳锦本文约3000字,建议阅读5分钟本文为大家介绍了四种关于复用Python代码的管理方法,以提高代码的效率及可读性等. 标签: ...

  8. android源码编译 老罗,Rx_Android 的简单实用方法(参考老罗代码)

    Rx是响应式编程的意思, 本质是观察者模式, 是以观察者(Observer)和订阅者(Subscriber)为基础的异步响应方式. 在Android编程时, 经常会使用后台线程, 那么就可以使用这种方 ...

  9. 弥合鸿沟:一种生成内部威胁数据的实用方法(Bridging the Gap: A Pragmatic Approach to Generating Insider Threat Data )

    Bridging the Gap: A Pragmatic Approach to Generating Insider Threat Data 弥合鸿沟:一种生成内部威胁数据的实用方法 摘要:恶意内 ...

最新文章

  1. mysql数据库提示本地无法连接远程服务器(Host is not allowed to connect to this MySQL server)解决办法
  2. Python基础班---第一部分(基础)---Python基础知识---第一个Python程序
  3. MYSQL 自定义排序
  4. Redis的SETNX
  5. 【python】循环结构if、for 、while
  6. SAP License:FI-CO集成
  7. 两台具有独立操作系统的计算机,第1章计算机网络习题与思考题参考答案
  8. python学习笔记:python字符串
  9. 群晖服务器密码修改,群晖nas使用教程:重置黑群晖登陆密码 – 群晖教程
  10. CAD:AutoCAD快捷键指令大全(非常值得收藏),本人项目案例实践积累总结
  11. gmail邮箱注册软件_前5名:Gmail的替代品,当今的免费软件基金会等
  12. SEO面试的一些常见问题整理
  13. Adobe产品adobe ID登录卡死问题的解决
  14. AM335xu-bootLOGO开机LOGO
  15. vlookup使用步骤_VLOOKUP函数的使用方法(入门级)
  16. 结构体类型struct
  17. 怎么将mp4改成mp3格式?
  18. 项目管理PMP学习之PMP ITTO
  19. 基于5532制作的实用话放(单电源供电)
  20. Mobileye专利 US9665100 - Sparse map for autonomous vehicle navigation 吐血整理

热门文章

  1. 60幅精美绝伦的绘景(Matte Paintings)作品欣赏
  2. 安全威胁泛化倒逼数据保护技术革新
  3. 面试官:MySQL事务的隔离性是如何实现的?
  4. 天线增益的计算公式(详细篇)
  5. 【转载】线性代数基础知识
  6. 为什么还有这么多人用C++写服务端?
  7. 从Noob开始学习python/pyqt5(1)环境安装,工程搭建与打包exe
  8. 一款简单而强大的TIF文件查看软件 -- IrfanView
  9. 获得理想薪资的11大技巧
  10. 青藤正式加入微软MAPP计划