这似乎是在我更新node/npm时开始的,但直到现在我才意识到我必须删除并重新创建我的node_modules文件夹。
我有一个 React Native 项目,其中包含核心模块和一个用于展示该模块的示例项目。示例项目在我的 package.json 中引用了这样的模块:
"dependencies": {
"module-core": "file:../core"
},
当我在示例项目中运行 npm install 时,我得到了这个 nodule_module 结构:
- Node 模块
- 核心
- core_dependency_1
- core_dependency_2
现在,我明白了:
- Node 模块
- 核心
- Node 模块
- core_dependency_1
- core_dependency_2
起初我认为这与 PeerDepcies 以及 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 和 Node 8.8.1。以前我有 Node 7.4.0。
是否有任何标志或方法可以让 npm 安装 localDependency 并且不将其视为快捷方式?
最佳答案
我终于找到答案了。 Npm 版本 5 确实改变了本地依赖项的处理方式,它只是创建了 npm link,在 Windows 中创建符号链接(symbolic link)或快捷方式。
您可以通过以下方式完成与以前相同的行为:
npm install $(npm pack <folder> | tail -1)
在 Windows 10 中使用 git-bash 为我工作
我的最终解决方案是在使用核心的示例项目中包含此 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 文件提交到存储库。
关于node.js - Node 本地依赖项安装为快捷方式并嵌套而不是平面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47420244/