在git控件下的node_modules中获取npm模块

问题描述 投票:2回答:3

我有很多git存储库,每个存储库都有自己的npm package.json文件,它们互相引用。当我使用npm install安装主程序包时,它成功克隆了所有package.json中引用的所有git repos到node_modules文件夹中。但是,它们没有克隆.git文件夹,以便我在源代码管理下保留任何更改。是否可以npm安装这些软件包并获取.git文件夹?

谢谢

git npm
3个回答
2
投票

他们不适合所有人,但我真的很喜欢使用git子模块来做这些事情,所以我想找到一种方法来使用它们:

  1. local_modules/下添加子模块: git submodule add -b develop [email protected]: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)你的预发布工作时,他们可以保证有适当的预发布模块代码


1
投票

一般来说,node_modules内的文件预计由npm管理。 Node最初并没有这样设计,但是npm已经发展成为node.js的标准包管理工具(它甚至随节点一起发布!)。

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

包特定模块

(有时也被称为“libs”)

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

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

大多数人将所有特定于包的模块放在名为libsrc的目录中。所以你可以要求它们:

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

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

花式包特定模块

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

在我的一个项目中,我在package.json中有这个:

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

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

独立模块由几个项目分成

如果您有多个项目共享多个模块,则可以(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。


1
投票

在晚会之后,但在阅读了几篇帖子,包括这一篇以及几次抨击/测试时间之后,我觉得有必要在版本控制下分享我对本地仓库的看法,用作节点项目中的包。

从项目的根目录完成所有操作:

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

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

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

你在npm文档中找不到关于使用“link”的最后一个,但这很关键

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

重要的是:你的本地包package.json必须有一个包“name:”键和一个指向入口点js文件的“main:”键,否则这一切都会失败。

现在你可以在你的代码中使用require('name'),之后如果你发布到npm你不需要改变任何期望项目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。

我的大技巧:当然你可以将你的本地软件包repo放在与你的项目不同的目录中,但如果你在项目的一个子目录中创建一个git子模块,那么你将获得两个世界中最好的东西,node_modules中的扁平依赖项以及项目和包(子模块)同时进行。另外,它使这些链接命令路径变得微不足道。

提示:如果您使用单独的目录(无子模块)路径,则使用您的ide编辑器(例如atom)将本地包文件夹添加到项目树中,以便使用您的项目进行编辑。太多了,如果你走这条路线,由你不是一个子模块,你可以提交并推送对本地包的更改。

可能我现在唯一能够想到的警告就是确保你的本地包中有依赖项,即使它们在项目的package.json中,否则如果有人在其他地方使用本地包(在它自己的地方)它会缺少npm install的依赖项

© www.soinside.com 2019 - 2024. All rights reserved.