繁体   English   中英

在git控制下在node_modules中获取npm模块

[英]getting npm modules in node_modules under git control

我有很多git存储库,每个存储库都有各自的npm package.json文件,它们相互引用。 当我使用npm install安装主软件包时,它将成功将所有package.json中引用的所有git repos克隆到node_modules文件夹中。 但是,对于我来说,它们没有与.git文件夹一起克隆,以使所有更改都受源代码控制。 是否可以npm安装这些软件包并获取.git文件夹?

谢谢

它们并不适合所有人,但我真的很喜欢使用git子模块进行此类操作,因此我想找到一种方法来使用它们:

  1. local_modules/下添加子模块:

     git submodule add -b develop git@github.com:JarvusInnovations/git-client.git local_modules/git-client 
  2. 使用file:前缀在package.json声明依赖项:

     { "dependencies": { "git-client": "file:local_modules/git-client" } } 
  3. 刷新node_modules/

     npm install 

现在,NPM在node_modules/下创建到../local_modules/git-client的符号链接,您可以将希望子模块放在主项目中的任何HEAD提交。 因此您的开发工作流程看起来像

  1. 对主项目和模块进行并行的一组更改
  2. 在子模块中进行提交以添加/更改功能
  3. 在主项目中进行提交,其中既包括子模块版本中的更改,也包括与之一起锁定的主项目中的更改

现在,当其他开发人员克隆( --recursive )或拉(然后运行git submodule update --init )进行预发布工作时,可以保证他们具有正确的预发布模块代码

通常, node_modules内部的文件应该由npm管理。 Node最初并不是以这种方式设计的,但是npm已经发展成为node.js的标准软件包管理工具(甚至与node一起提供!)。

如果您有自己想要维护的模块,则有几种处理方法。

包特定的模块

(有时也称为“库”)

编写自己的模块的最简单方法是要求使用相对或绝对路径:

var my_module = require('./my_module'); // notice '.js' is not needed

大多数人将所有软件包特定的模块放在一个名为libsrc的目录中。 因此,您可以要求它们为:

var my_module = require('./lib/my_module');

请注意,该路径是相对于您正在编辑的文件的。 因此,如果一个lib文件需要另一个lib文件,则不需要'/lib'

花式包装专用模块

有些人在require()不喜欢'./lib/..'的外观。 但是他们仍然希望其特定于软件包的模块在软件包回购的控制之下。 在这种情况下,一种解决方案是将模块符号链接到node_modules

在我的一个项目中,我在package.json中有以下内容:

"postinstall": "bash -c 'cd node_modules;ln -sf ../lib/*.js .'"

它的作用是创建所有的符号链接.js中的文件./lib当您运行到node_modules文件夹npm install

独立模块由多个项目分片

如果您的多个项目共享多个模块,则可以(ab)使用node.js搜索模块的方式。 Node.js将在当前目录中搜索文件夹node_modules在其中搜索模块,如果找不到它,它将递归node_module文件夹等的父目录,一直到根目录。

因此,拥有自己的自我管理模块的一种方法是将node_modules文件夹放在父目录中:

/home/myself/
    code/
        node_modules/
            my_module1.js
            my_module2/
                node_modules
                .git
                index.js
                package.json
        project1/
            node_modules/
            .git
            main.js
            package.json
        project2/
            node_modules/
            .git
            main.js
            package.json

这样, project1project2都可以访问my_module1my_module2 另外, my_module2可以有自己的git repo。

参加聚会的时间很晚,但是在阅读了几篇文章(包括一篇以及几个小时的抨击/测试后)后,我感到不得不与我分享我在版本控制下用作节点项目中的软件包的本地仓库的看法。

从项目的根目录开始:

npm link /path/to/your/local/package/

npm link <"name:"> “ name:”在本地包的package.json中的键

npm install --save /path/to/your/local/package/

您不会在npm文档中找到有关使用“链接”的最后一个,但这很关键

注意 :您可以使用相对路径(例如,如果共享父文件夹, ../<localpackagefoldername>

重要 :您的本地软件包package.json必须有一个软件包“名称:”键和一个“ main:”键指向一个入口点js文件,否则所有操作都会失败。

现在,您可以在代码中使用require('name') ,以后再发布到npm时,您无需进行任何更改,可以在project package.json中找到该行,就像删除一样容易删除和npm install

如果使用npm install将软件包添加到本地模块,则在项目中执行相同的操作,它将被添加到项目的node_modules中。 如果您在本地软件包中进行npm uninstall ,则在项目中进行npm prune

注意 :如果已在本地软件包根目录中运行npm install在该软件包的根目录中创建了node_modules,现在当您在项目中进行npm install ,您将收到类似这样的警告,您可以忽略skippingAction Module is inside a symlinked module: not running remove 如果那有问题,那么您可以在不单独运行本地软件包的情况下删除node_modules文件夹。

从npm 3开始,现在已对node_modules进行了展平,因此以这种方式进行操作意味着您在项目中对本地包的依赖也已展平! 此外,您不能仅将完整的git repo放入node_modules中,因为npm会鄙视.git文件夹,当然您将嵌套node_modules。

我的大把戏 :确保您可以在与项目不同的目录中拥有本地软件包存储库,但如果将其作为项目子目录中的git子模块,则可以兼得两全,node_modules中的扁平化依赖项以及项目和包(子模块)同时进行。 另外,它使那些链接命令路径变得微不足道。

提示 :如果您转到单独的目录(无子模块)路径,请使用ide编辑器(例如atom)将本地包文件夹添加到项目树中,以便于您的项目轻松编辑。 同样,如果您走这条路线,则由您来提交和推送对本地包的更改,因为它不是子模块。

我可能目前唯一需要注意的警告是,即使本地软件包中有依赖项,也要确保它们在项目的package.json中,否则如果有人在其他地方(自己使用)使用本地软件包,它将缺少npm install依赖项

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM