“修补”node_modules 模块的正确方法是什么?

Piw*_*oli 7 patch node.js npm

假设我有一个 Node.js 应用程序,我们称之为patched-app。这个应用程序是一个简单的应用程序,它使用提示同步来请求用户输入,然后用它来做一些事情。

所以我们创建一个文件夹patched-app并用 初始化它npm init。然后,我们运行并创建一个名为“我的代码所在位置”npm i prompt-sync的新文件。index.js为了让事情变得更有趣,我还将在这里创建一个 git 存储库,这就是结果:

+---patched-app
|   |   .gitattributes
|   |   .gitattributes
|   |   .gitignore
|   |   index.js
|   |   package-lock.json
|   |   package.json
|   |   
|   +---node_modules
|   |   |   .package-lock.json
|   |   |   
|   |   +---ansi-regex
|   |   |       index.js
|   |   |       license
|   |   |       package.json
|   |   |       readme.md
|   |   |       
|   |   +---prompt-sync
|   |   |       index.js
|   |   |       LICENSE
|   |   |       package.json
|   |   |       README.md
|   |   |       test.js
|   |   |       
|   |   \---strip-ansi
|   |           index.d.ts
|   |           index.js
|   |           license
|   |           package.json
|   |           readme.md
|   \---.git
|      <<git stuff>>
Run Code Online (Sandbox Code Playgroud)

现在的问题是我不喜欢这个prompt-sync包中的某些内容,因此我想node_modules/prompt-sync/index.js根据自己的喜好对其进行编辑和更改。我不一定想创建一个全新的模块,例如prompt-sync-swiffy(或者我吗?),因为我的更改足够小,所以我不必下载任何新的软件包prompt-sync,所以我对现有的依赖项很满意ansi-regexstrip-ansi

我可以打开它node_modules/prompt-sync/index.js,编辑它,然后就完成了——这就是我到目前为止一直在做的事情,因为我不知道更好的了。不过,我至少认识到三个主要问题:

  • 我无法prompt-sync再更新,否则我可能会丢失所做的更改(丢失!==只是破坏了我修补的更改)
  • 我基本上无法运行任何包命令,例如npm audit fix等,因为这些命令也可能会覆盖我的更改
  • 如果我想将我的项目放在 git 存储库中,这根本不起作用,因为我显然会添加到,node_modules如果.gitignore有人拉取我的存储库并运行npm install,它将安装prompt-sync而不需要我的更改

我也不一定想要分叉prompt-sync和/或创建一个新的“官方”NPM 包。我想要的是一种允许我或其他任何人npm install正常运行的方法,同时以某种方式将我的模块补丁保留在本地,例如拥有一个module_patches不会被存储库忽略的文件夹。

prompt-sync如果新版本破坏了我的补丁也没关系。我需要更新补丁或使用锁定版本的prompt-sync.

那么我有什么选择呢?

And*_*rei 11

修补 NPM 包的一个好方法是使用patch-package。它将自动创建您的更改的补丁文件并将其应用到 postinstall 挂钩中。

  • 为什么我两年前没有发现这个? (2认同)