2013-03-07 99 views
3

如何在安装前在我的软件包中更新非-npm-package包?在npm软件包中使用非npm-git子模块

我正在使用git并且有一个node.js模块,它依赖于也托管在git存储库中的外部项目。我将外部项目添加为子模块,现在我试图制作一个npm包。

由于外部的依赖是不是NPM包(也不是一个节点模块),我想我不能使用npm submodule命令,所以我在package.json文件提出了this前脚本:

"scripts": { "preinstall" : "git submodule update --init"} 

当我在包目录下执行npm install,它工作正常,但是当我试图直接从我的远程git仓库或npm pack作出的压缩包安装包,我得到以下错误:

 
You need to run this command from the toplevel of the working tree. 

我也试过(如错误消息说):

"scripts": { "preinstall" : "cd $(git rev-parse --show-toplevel) && git submodule update --init"} 

这一个不显示任何错误,但也不会更新包目录中的子模块。

任何帮助,将不胜感激。

回答

1

您下载的npm一经提取,不再包含git信息(无.git目录)。

所以没有git命令会以这种方式工作,但在本地工作,因为你有git信息。

至于解决方案,您可能必须创建一个脚本,它执行npm pack所做的操作,但不会忽略子模块。

不是我试过,但这个脚本https://github.com/Kentzo/git-archive-all可能是工作了的东西的盒子状

git-archive-all --prefix package/ module.tgz 

可能需要一些调整...

+0

你确定所提取的包不有'.git'目录?如果是这样,我应该能够在那里启动'git'回购,因为'.gitmodules'已经存在,我可以简单地更新git'submodules'。 – fardjad 2013-03-08 10:00:53

+0

我确定.git不是'npm pack'生成的档案文件的一部分。运行'git init'可能会起作用。值得一试。作为npm消费者,我不确定我想为给定版本获得不同的代码,但是如果这是供您自己使用的,并且您没有问题,那么确定。 – 2013-03-08 10:17:37

+2

我试过'git init',它初始化了一个空的git仓库。但我不得不再次手动添加子模块;似乎在repository中有'.gitmodules'对于'git'来识别'submodules'是不够的。最后,我将我的软件包预安装脚本更改为'git clone git:// path/to/remote/repo',并且将远程仓库目录的名称添加到'.npmignore'中,现在一切正常。 – fardjad 2013-03-08 12:48:16