在npm包中使用非npm包的git子模块

4

如何在安装前更新包中的

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

由于外部依赖项不是npm包(也不是node模块),我认为我不能使用npm submodule命令,因此我想出了在package.json文件中使用this预安装脚本:

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

当我在包目录中执行npm install时,它可以正常工作,但是当我尝试直接从我的远程git存储库或使用npm pack创建的tarball安装软件包时,我会收到以下错误消息:
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个回答

3
您下载的 npm,一旦解压缩,就不再包含 git 信息(没有 .git 目录)。
因此,这种方式无法使用 git 命令,但是由于您拥有 git 信息,所以可以在本地使用。
至于解决方案,您可能需要创建一个脚本,执行类似于 npm pack 的操作,但不忽略子模块。
我没有尝试过,但是这个脚本 https://github.com/Kentzo/git-archive-all 可能可以直接使用,例如:
git-archive-all --prefix package/ module.tgz

可能需要一些微调...


你确定提取的包中没有.git目录吗?如果是这样的话,我应该能够在那里初始化一个git仓库,并且由于.gitmodules已经存在,所以我可以简单地更新git子模块 - fardjad
我确信 .git 不是 npm pack 生成的归档文件的一部分。运行 git init 可能会起作用。值得一试。作为 npm 用户,我不确定是否希望获取给定版本的不同代码,但如果这是为了您自己的使用,并且您对此感到满意,那么可以这样做。 - Pascal Belloncle
2
我尝试了 git init,它初始化了一个空的 git 仓库。但是我不得不再次手动添加 submodules;似乎在仓库中有 .gitmodules 并不足以让 git 识别 submodules。最后,我将我的包预安装脚本更改为 git clone git://path/to/remote/repo,并将远程仓库目录的名称添加到 .npmignore 中,现在一切都正常工作了。 - fardjad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接