如何编辑通过 npm 安装的节点模块?

Posted

技术标签:

【中文标题】如何编辑通过 npm 安装的节点模块?【英文标题】:How to edit a node module installed via npm? 【发布时间】:2012-10-29 07:18:27 【问题描述】:

我使用的是 node_swiz 模块,而后者又使用了验证器模块。

我想对验证器模块进行更改,但我使用 npm install 来安装模块/依赖项。

我可以只对 node_modules 中的验证器模块进行更改,还是会重新创建 node_modules 依赖项并在我发布到 heroku 或下次运行 npm install 时获取最新版本?

结构如下:

myNodeApplication
  - node_modules
     - swiz
         - node_modules
            - validator [this is the library I want to edit]

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您可以直接编辑该文件,但每当 npm 更新时,这将被覆盖,最好的办法是直接访问源代码。

如果更改影响了整个模块的功能,并且可能对其他人有用,您可能希望为 github 上的原始源做出贡献并寻找要实施的更改。

如果这是需要的专有功能,并且无助于模块的开发,最好的办法是从 github 分叉它并进行更改。您可以使用 NPM 直接从 github 安装项目,这种方法可以让您将未来的更改从原始源集成到您的自定义版本中。

要直接从 github 安装,请使用以下命令:

npm install https://github.com/<username>/<repository>/tarball/<branch>

【讨论】:

谢谢!这正是我想知道的。另外,对于其他阅读此内容的人...我想将我的 github 上的模块包含在 package.json 文件中,这里有关于此的信息:***.com/a/8306715/1810875 在分叉之前我在本地系统中更改它,但更改似乎没有影响。更改 node_modules/package_name/lib/file_name.js 的任何 javascript 文件会影响吗? 只是一个注释,不确定是否发生了变化,但我个人必须将 Git URL 指定为 git://github.com//.git" @JohnDevor 不要安装自定义模块,而是使用“npm link”命令创建一个指向其文件夹的符号链接:docs.npmjs.com/cli/link 想通了,我必须导航到/node_modules 中的文件夹并运行npm install 然后一切都很好!【参考方案2】:

我不想发布新模块,也不想npm install 覆盖我的更改。我找到了解决这两个问题的方法,但接受@Sdedelbrock 的建议可能会更好。但如果你想这样做,方法如下:

    编辑您的package.json 文件以删除您要编辑的依赖项。 进入项目的/node_modules 并将文件夹移动到存储库中可以提交的其他位置。所以现在/node_modules/dependency/dependency cd 进入依赖目录并输入 npm link cd 进入项目目录的根目录并输入 npm link dependency /node_modules/dependency 之外执行此操作很重要

如果一切正常,您现在应该有一个在/node_modules/dependency 中创建的符号链接。现在您可以运行您的项目,看看它是否有效。

【讨论】:

缺点:1) 你永远不能更新包版本,即使它有安全问题。 2)如果您(或您未来的开发人员)想要这样做,他们必须花时间手动比较整个包以找出您所做的更改。 3) github.com/facebook/create-react-app/issues/5372 所以,TL;DR:这会让你未来的自己或队友非常沮丧。【参考方案3】:

您可以使用patch-package 对节点模块进行更改并保持更改。

这可以通过首先更改 node_modules 中的包然后运行以下命令来完成,<package name> 是您刚刚更改的包的名称。

npx patch-package <package name>

patch-package 然后将创建一个patches 文件夹,其中包含一个文件,代表您的更改。然后可以将该文件提交到 git,稍后可以通过运行 npx patch-package(不带任何参数)来恢复补丁。

可选步骤:

在 package.json 的脚本部分添加以下内容,以便在执行“npm install”时自动修补依赖项。

"postinstall": "npx patch-package" 

【讨论】:

非常好的解决方案,对我来说没有任何问题。 这真的很酷!仅供参考:我不得不使用“preinstall”而不是“postinstall”,因为我的补丁是依赖项的 postinstall 脚本。如果您有其他需要在安装后阶段应用的补丁,您将如何实施? 难以置信的答案,我需要在部署到 netlify 之前对一个 dep 进行修改。 preinstall 'npx patch-package' 是神奇的门票。正确的图像现在显示在网站上。 很棒的答案!谢谢。请注意,如果您在包中的“更改”在其package.json 中(例如更新过时的固定版本依赖项),您需要执行npx patch-package &lt;package name&gt; --exclude。默认不获取子包package.json的变化。 很好的解决方案!本文详细介绍了如何使用补丁包:callstack.com/blog/…【参考方案4】:

fork Github repo 并进行必要的更改,然后您可以像这样安装包

npm install git+https://github.com/visionmedia/express.git

【讨论】:

以上是关于如何编辑通过 npm 安装的节点模块?的主要内容,如果未能解决你的问题,请参考以下文章

节点版本管理器 (NVM) npm 将模块安装到公共文件夹

git被阻止,如何安装npm模块

NPM 模块不会在没有 sudo 的情况下全局安装

不带节点安装npm

通过GIT安装私有NPM模块,并让它更新?

Node.js:如何创建付费节点模块?