节点本地依赖项安装为快捷方式而嵌套而不是平面

时间:2017-11-21 18:31:29

标签: node.js react-native npm

这似乎是在我更新node / npm时开始的,但直到现在我还没有意识到我必须删除并重新创建我的node_modules文件夹。

我有一个React Native项目,它有一个核心模块和一个Example项目来展示模块。示例项目在我的package.json中引用了这样的模块:

  "dependencies": {
    "module-core": "file:../core"
  },

当我在Examples项目中运行npm install时,我得到了这个nodule_module结构:

  • node_modules
    • core_dependency_1
    • core_dependency_2

现在,我明白了:

  • node_modules
      • node_modules
        • core_dependency_1
        • core_dependency_2

起初我认为它与peerDepencies有关,以及npm如何处理平面/嵌套依赖项,但我已经检查过,现在看来核心文件夹现在是一个快捷方式(我正在使用Windows)。

这打破了我的gradle脚本,因为有些脚本被引用如下:

apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"

我可以通过重命名链接来修复此问题,但这会使构建平台/环境依赖。

它还打破了其他一些脚本:

apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"

这是因为project()解析为我的根文件夹,现在我也无法使用它。

我正在使用npm 5.4.2和节点8.8.1。以前我有节点7.4.0。

是否有任何标志或方法使npm安装localDependency而不将其视为快捷方式?

1 个答案:

答案 0 :(得分:0)

我终于找到了答案。 Npm Version 5确实改变了本地依赖关系的处理方式,它只是创建了npm链接,它在windows中创建了符号链接或快捷方式。

您可以使用此方法完成与以前相同的行为:

npm install $(npm pack <folder> | tail -1)

使用git-bash在Windows 10中为我工作

我的最终解决方案是在使用核心的Example项目中使用这个package.json:

{
  "name": "core-examples",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "preinstall": "npm pack ../Core | tail -1",
    },
  "dependencies": {
    "core": "file:core-0.0.0.tgz"
  },
  "jest": {
    "preset": "react-native"
  }
}

预安装脚本将生成tgz文件,然后您可以照常安装。这将避免必须将tgz文件提交到存储库。