使用纱线工作区在 npm 上创建可用的库...

2023-12-19

我正在寻找有关我编码的模式的反馈一边修修补补。

Context

我正在为我的公司创建一个包,该包将公开发布。 DX(开发人员体验)对我们来说是最重要的,为此我选择了开发中的最新趋势:Typescript、esm 等...我想提出多个模块并使导入易于使用,类似到(例如)nextjs 的next/Router.

[EDIT]我发现关于这个线程 https://stackoverflow.com/questions/49858168/how-to-publish-typescript-modules-on-npm-without-dist-in-import并交叉引用以进行曝光。

第一步

我从一个简单的单个包、tsconfig 和 src/、tests/ 和 dist/ 文件夹开始了我的第一次尝试。那里没有什么令人难以置信的异国情调,但如果您一直这样做,您就会知道发布此内容将导致您的导入路径包含dist稍后的。

You can使用 package.json 修复此问题main字段,但这仅适用于顶级模块;你可以用exports,但它不能很好地与 Typescript 配合使用。最简单的修复方法是cp package.json dist/ && npm publish dist/,到这里,问题就解决了。

然后我想为了测试这个,我会npm link我的 dist/ 文件夹,实际上创建了“包中包”,几乎没有问题:

  • the cp package.json dist/部分会成长为有*.md,谁知道它还会增长什么/如何增长(我不想有构建脚本文件)
  • 我仍然需要构建一个测试应用程序来在 DX 级别测试我的库,以及在哪里托管它?

所以我想:为什么不把它全部提升为单一仓库呢?

转折点

树结构将从:

myLib/
  package.json → build + test + publish script
  tsconfig.json
  jest.config.json
  .npmignore → managing what to distribute
  ...lots of config files
  src/
  dist/
  tests/

to:

myLib/
  package.json → workspaces
  src-pkg/
    package.json → build script
    tsconfig.json → localized conf for build
  dist-pkg/
    package.json → publish script
  test-pkg/
    package.json → test script
    jest.config.json → localized conf for test

传递构建的文件src-pkg to dist-pkg,我只需要指向 tsc 中的文件夹(tsc --project . --outDir ../dist-pkg)

甚至可以通过在顶层的 npm 脚本中编排工作区命令来恢复与单个包中相同的流程,例如:

{
  "workspaces": ["src-pkg", "test-pkg", "dist-pkg"],
  "scripts": {
    "build": "yarn workspace src-pkg run build",
    "test": "yarn workspace test-pkg run test",
    "publish": "yarn workspace dist-pkg run publish"
  }
}

后退一步

福利该结构的大部分内容都在 test-pkg 中。它可以轻松地随意测试 src-pkg 或 dist-pkg,因为这两种结构都是扁平且相似的。这样,就可以在构建之前或之后测试工作流程。

另外(这是我主要感兴趣的领域),通过位于 src-pkg 之外,test-pkg 具有我的库的使用者的 PoV(Typescript 上下文和所有) - 特别是如果使用 dist-pkg 作为依赖项 - 这样我就可以有效地提高开发人员体验,就像我是我未来的客户一样。

还有其他一些小事情,特别是使用 monorepo 进行扩展的稳定性,或者我可以在 dist-pkg 中提供单独的“公共友好”自述文件,同时在 src-pkg 清单中提供更多内部/私人详细信息。

缺点值得注意的是 semver 的管理(src-pkg 和 dist-pkg 是分开的),而且这是一个我以前从未见过的结构......感觉有点像 monorepo 结构的滥用。


所以,我已经构建了它并且它可以工作......但即使可以构建并不意味着它应该如此。

人们构建库和 SDK,你们怎么看?

感谢您的反馈意见。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用纱线工作区在 npm 上创建可用的库... 的相关文章

随机推荐

  • 没有工厂就无法实例化的参数化工厂和产品类

    我正在按照对上一个问题的回答中提出的内容来实现 Factory 类 工厂方法实现 C https stackoverflow com questions 410823 factory method implementation c 5343
  • BitmapFactory:无法解码流:java.io.FileNotFoundException

    我有一个关于 BitMapFactory decodeFile 的问题 在我的应用程序中 我希望用户能够从他 她的设备中选择图像或拍照 然后必须将其显示在 ImageView 中 这是代码片段 Uri selectedImage data
  • z3 实数的存在主义理论

    Z3决定非线性实数运算的存在片段吗 也就是说 我可以用它作为决策程序来测试是否 带有 和 x 的无量词公式有实数解吗 是的 Z3有一个非线性多项式实数运算的存在片段的判定过程 当然 该过程是以可用资源为模完成的 该过程相当昂贵 本文 htt
  • 如何在 Linux 中创建文件监听器?

    我试图在特定目录上创建一个侦听器 每当该路径中出现文件时 该侦听器就会启动 Linux 命令 例如 每当文件出现在 C home 这样的目录中时 我想从该文件中读取一串文本 然后启动另一个命令 我正在考虑使用循环 但这似乎效率低下 要获得有
  • 为什么实例化 JsonSlurper 会导致不可序列化异常?

    这是我的 Jenkins 文件 Library libs dev libs pipeline agent any stages stage json steps script my lib jsonslurper 这是我的常规共享库 var
  • 二维中的正则表达式有什么好的/有趣的类似物吗?

    二维正则表达式是否有任何好的 或至少有趣但有缺陷的 类似物 在一个维度我可以写类似的东西 aaac bc b aaa 快速拉出交替区域bs and cs 的边框至少为 3as 也许同样重要的是 我可以在一个月后回来 一目了然地看到它在寻找什
  • 选择每个 id 的前 x

    我对 SQL 有点生疏了 可以说我有tblMachineLogs with MachineLogID MachineID LogTime date time 该表充满了来自 10 台机器的日志MachineID1 到 10 并且有很多行 例
  • Google Apps 脚本 - 迭代文件夹和子文件夹

    我想使用 google apps 脚本迭代 Google Drive 中文件夹的树结构 下面的代码列出了一些文件夹 但不是全部 您能建议什么是深入文件夹结构的最佳技术吗 我首先尝试记录所有文件夹名称 谢谢 function test lis
  • 在Windows中使用dos批处理程序的原因是什么?

    Question 在现代 Windows 系统上使用 dos 批处理语言编写一些重要任务而不是下载 PowerShell 或 ActiveState Perl 的一个好的 理想情况下 技术上的 理由是什么 更具体地说 我在这个问题期间做出以
  • 如何使用selenium同时打开多个实例Firefox而不清除缓存和cookie

    我有一个从 Facebook UID 中抓取好友列表的代码 它有效 但需要很长时间才能抓取整个列表 因此 我想通过使用多处理和 Selenium Grid 来加快速度 以下是我使用的方法 使用帐户登录 Facebook 打开 5 个具有相同
  • WPF DataGrid如何根据绑定数据将ColumnType设置为不同类型?

    我有 首选项 数据结构 其中有字符串 值 字段和 类型 字段的枚举 类型可以是 0 布尔值 1 整数 2 字符串 根据此类型字段中的值 我想以不同方式显示 值 单元格 例如复选框 文本框 下拉列表等 因此 为了清楚起见 同一列应根据该行中的
  • 如何使用js向td添加按钮?

    我有一个动态生成的表 因为它正在生成 TD 我想将第一个 TD 设置为按钮 下面是我的代码 显然不起作用 我记得我遇到的另一个问题是我们可以使用 html 更改 div 的内容 但这在这里也不起作用 Code var table docum
  • Django modeltranslation - 无法获取和查看原始字段

    我正在尝试使用django modeltranslation在我的项目中 目前 只是为了Tag具有一个字段的模型 name 我已经创建并注册了TranslationOptions then makemigrations and migrat
  • 如何使用 gradle 使用平台密钥签署 Android 应用程序?

    我看到了几个类似的问题 例如 Android 构建平台源代码后 如何使用平台密钥签署任意APK https stackoverflow com questions 4247818 android after building platfor
  • Redis作为数据库

    我想使用Redis作为数据库 而不是缓存 根据我 有限 的理解 Redis 是一个内存数据存储 使用 Redis 有哪些风险 如何减轻这些风险 您可以通过多种不同方式将 Redis 用作权威存储 Turn on AOF 仅追加文件存储 请参
  • 使用 Amazon SES 的 Codeigniter SMTP 电子邮件

    我想昨天亚马逊宣布了对 SES 简单电子邮件服务 的 SMTP 支持 我尝试使用 Codeigniter 发送 SMTP 电子邮件 但没有成功 我有一个经过验证的发件人 一切看起来都很好 this gt load gt library em
  • 查找从开始日期到年底的每个星期五

    所以我又带着另一个令人困惑的日期时间问题回来了 在 C 中 我如何返回从开始日期 DateTime Now 到今年年底 例如 今天是 19 号星期五 它将返回 26 2 9 16 23 30 7 等 这有效吗 static IEnumera
  • 如何用 Dotrine 保存图像

    我想在我的文章实体中保留图像 Doctrine2 可以做到这一点吗 我该怎么做呢 此致 博多 使用带有 File 类型的 ODM 设置非常简单 对于 ORM 实体 我会考虑创建一个像这样的列 注意 使用此链接将 blob 类型添加到 Doc
  • 使用 multipart/form-data 和 JSON 进行 Curl 发布

    有没有办法使用curl来做multipart form data发布并指定数据是application json 它不一定是卷曲的 这就是我使用的 效果很好 curl v H Content Type multipart form data
  • 使用纱线工作区在 npm 上创建可用的库...

    我正在寻找有关我编码的模式的反馈一边修修补补 Context 我正在为我的公司创建一个包 该包将公开发布 DX 开发人员体验 对我们来说是最重要的 为此我选择了开发中的最新趋势 Typescript esm 等 我想提出多个模块并使导入易于