本地仓库作为依赖项

3
我在两个仓库中进行开发,其中一个是另一个的依赖项。我使用npm v5。我在main-repopackage.json中将依赖项指定为../dependent-repo。当我运行npm install时,这会在main-repo/node_modules中创建一个指向../../dependent-repo的符号链接,指向dependent-repo
问题在于,dependent-repo本身有自己的node_modules,因此当我引用(require或import)其依赖项中的内容时,默认解析过程会解析为dependent-repo/node_modules中的依赖项,而不是main-repo/node_modules中的依赖项。
这实际上是TypeScript的问题,因为显然它认为main-repo/node_modules/@angular/coredependent-repo/node_modules/@angular/core不同,即使它们是相同版本和完全相同的二进制文件。这导致了类似于以下形式的TS错误:

'ViewContainerRef'类型的参数不能赋值给'typeof ViewContainerRef'。

我对这个问题很熟悉,因为当我使用npm link时,它也出现在npm v3中。这个问题在TS问题列表中得到了广泛讨论,但据我所知还没有解决方案。我希望npm v5会以某种神奇的方式解决这个问题,但到目前为止还没有运气。
我尝试将依赖项指定为file://../dependent-repo,但这只是创建了相同的符号链接(至少在npm5中;我记得在早期版本中可能复制了整个目录)。
目前我唯一能想到的解决方法是让依赖项指向github服务器,然后每次我做出更改时提交并推送,并在主repo上重新运行npm install来获取最新更改。这正是我想要避免的。
我想过在测试main-repo之前临时将dependent-repo/node_modules重命名,因此它被省略在解析过程中。但是,这显然需要dependent-repo的所有依赖项存在于main-repo中。
我尝试在main-repotsconfig.json中玩弄paths选项,并且使用像paths: {"*": ["node_modules"]}这样的内容有所进展,但无法完全使其工作。

我知道angular-cli可能已经对其内部的webpack配置进行了一些更改,以使它更好地工作,但不幸的是,我的main-repo使用较旧的webpack构建过程,因此我无法使一些建议的更改(例如resolve: {fallback: [path.join(__dirname, 'node_modules')]} resolve: { modules: [ path.join(__dirname, "node_modules") ] } )对我生效。


1
我知道你想避免基于Git的依赖样式,但这是处理NodeJS子依赖项的最安全方式,特别是如果你的项目增长并使用容器和CI之类的东西。首先,我建议使用git-hooks和NPM脚本进行自动化处理。 - Luís Brito
1个回答

0

你可以在dependent仓库中添加一个新的远程git,但是新的“remote”将在你的本地机器上。这样,你就可以使用git push <remote-name> <branch>命令,并将仓库url指向你的main仓库以从你的远程仓库拉取代码。 [git如何添加本地仓库并将其视为远程仓库 这是一个hacky的解决方案,但在使用一些makefiles时应该会减轻一些痛苦。


1
makefiles?那是什么? - user663031

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