我有很多git存储库,每个存储库都有自己的npm package.json文件,它们相互引用。当我使用npm install安装主程序包时,它成功克隆了所有package.json中引用的所有git repos到node_modules文件夹中。但是,它们没有克隆.git文件夹,以便我在源代码管理下保留任何更改。是否可以npm安装这些软件包并获取.git文件夹?
由于
答案 0 :(得分:2)
它们并不适合所有人,但我真的很喜欢使用git子模块进行此类操作,因此我想找到一种方法来使用它们:
在local_modules/
下添加子模块:
git submodule add -b develop git@github.com: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
)您的预发布工作时,就可以保证他们具有正确的预发布模块代码< / p>
答案 1 :(得分:1)
通常,node_modules
内的文件应由npm
管理。 Node最初并没有这样设计,但是npm已经发展成为node.js的标准包管理工具(它甚至还带有节点!)。
如果您有自己想要维护的模块,有几种方法可以处理它。
(有时也被称为&#34; libs&#34;)
编写自己的模块的最简单方法是要求使用相对或绝对路径:
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
内{/ 1}}个文件到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。
答案 2 :(得分:1)
参加晚会但是在阅读了几篇帖子后,包括这一篇以及几次抨击/测试时间之后,我觉得有必要在版本控制下分享我对本地仓库的看法,该版本控制被用作节点项目中的软件包。
从项目的根目录执行此操作:
npm link /path/to/your/local/package/
npm link <"name:">
“name:”键在本地包的package.json
npm install --save /path/to/your/local/package/
使用“link”在npm文档中找不到的最后一个,但它是关键的
note :您可以使用相对路径(例如,如果共享父文件夹,则为../<localpackagefoldername>
)
重要:你的本地包package.json必须有一个包“name:”键和一个指向入口点js文件的“main:”键,否则这一切都会失败。
现在您可以在代码中使用require('name')
,稍后如果您发布到npm,则无需更改任何期望项目package.json中的行,这将很容易删除并{{1编辑。
如果使用npm install
将包添加到本地模块,则在项目中执行相同操作,并将其添加到项目的node_modules中。如果您在本地套餐中执行npm install
,请在项目中执行npm uninstall
note :如果您在本地软件包根目录中运行npm prune
,那么就为该软件包创建了node_modules,现在当您在项目中npm install
时,您将获得这样的警告你可以忽略npm install
。如果您有错误,那么如果您没有单独运行它,请删除本地包中的node_modules文件夹。
从npm 3开始,node_modules现在已经展平,因此这样做意味着项目中的本地包依赖性也会变平!此外,您不能只将完整的git repo放入node_modules,因为npm会鄙视.git文件夹,当然您将嵌套node_modules。
我的大招数:当然,您可以将本地软件包存储在与项目分开的目录中,但如果您在项目的子目录中创建git子模块,则可以获得两全其美的效果,flat_ned node_modules中的依赖项,同时组合推送项目和包(子模块)。另外,它使这些链接命令路径变得微不足道。
提示:如果您使用单独的目录(无子模块)路径,则使用您的ide编辑器(例如atom)将本地包文件夹添加到项目树中,以便使用您的项目进行编辑。太多了,如果你走这条路线,你可以提交并推送更改本地包,因为它不是一个子模块。
这个我能想到的唯一警告可能是确保你的本地包中有依赖项,即使它们在项目的package.json中,否则如果有人在其他地方使用本地包(在它自己的地方) )它将缺少skippingAction Module is inside a symlinked module: not running remove