【发布时间】:2017-12-11 04:33:39
【问题描述】:
我正在开发两个存储库,一个依赖于另一个。我在 npm v5 上。我将main-repo 的package.json 中的依赖关系指定为../dependent-repo。当我执行npm install 时,这会在main-repo/node_modules 中为dependent-repo 创建一个符号链接,指向../../dependent-repo。
问题是dependent-repo 在它下面有自己的node_modules,所以当我在 its 依赖项之一中引用(要求或导入)某些东西时,默认解析过程会解析为dependent-repo/node_modules 中的依赖,而不是 main-repo/node_modules 中的依赖。
这被证明是 TypeScript 的一个问题,因为它显然认为 main-repo/node_modules/@angular/core 与 dependent-repo/node_modules/@angular/core 不同,即使它们是相同的版本,并且逐字节相同。这会产生格式为
“ViewContainerRef”类型的参数不能分配给“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 上。
我尝试在tsconfig.json(在main-repo)中使用paths 选项,并且对paths: {"*": ["node_modules"]} 之类的东西有一些运气,但无法让它完全工作。
我了解angular-cli 可能对其内部 webpack 配置进行了一些更改以使其更好地工作,但不幸的是我的main-repo 使用较旧的 webpack 构建过程,我无法进行一些建议的更改,例如resolve: {fallback: [path.join(__dirname, 'node_modules')]} 或 resolve: { modules: [ path.join(__dirname, "node_modules") ] } 为我工作。
【问题讨论】:
-
我知道你试图避免基于 Git 的依赖风格,但它是处理 NodeJS 子依赖的最安全方式,特别是如果你的项目增长并使用容器和 CI 的东西。我会首先使用 git-hooks 和 NPM 脚本进行一些自动化操作。
标签: npm node-modules npm-link