我有很多git存储库,每个存储库都有自己的npm package.json文件,它们互相引用。当我使用npm install安装主程序包时,它成功克隆了所有package.json中引用的所有git repos到node_modules文件夹中。但是,它们没有克隆.git文件夹,以便我在源代码管理下保留任何更改。是否可以npm安装这些软件包并获取.git文件夹?
谢谢
他们不适合所有人,但我真的很喜欢使用git子模块来做这些事情,所以我想找到一种方法来使用它们:
local_modules/
下添加子模块:
git submodule add -b develop [email protected]:JarvusInnovations/git-client.git local_modules/git-client
file:
前缀在package.json
中声明依赖:
{
"dependencies": {
"git-client": "file:local_modules/git-client"
}
}
node_modules/
:
npm install
现在,NPM在node_modules/
下创建了一个符号链接到../local_modules/git-client
,你可以将你希望子模块的HEAD提交到主项目。所以你的开发工作流程看起来像
现在当其他开发人员克隆(--recursive
)或拉(然后运行git submodule update --init
)你的预发布工作时,他们可以保证有适当的预发布模块代码
一般来说,node_modules
内的文件预计由npm
管理。 Node最初并没有这样设计,但是npm已经发展成为node.js的标准包管理工具(它甚至随节点一起发布!)。
如果您有自己想要维护的模块,有几种方法可以处理它。
(有时也被称为“libs”)
编写自己的模块最简单的方法是要求使用相对或绝对路径:
var my_module = require('./my_module'); // notice '.js' is not needed
大多数人将所有特定于包的模块放在名为lib
或src
的目录中。所以你可以要求它们:
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
通过这种方式,project1
和project2
都可以使用my_module1
和my_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文档中找不到关于使用“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
的依赖项