【问题标题】:Can i move my node_modules folder to another project?我可以将我的 node_modules 文件夹移动到另一个项目吗?
【发布时间】:2019-11-13 04:34:56
【问题描述】:

我在当前的一个 iOS React Native 项目中遇到了一些问题,我花了很长时间致力于这个项目。我决定重新开始。然而,我确实花了很多时间来确保我得到了各种反应原生模块的正确版本并配置它们以工作。这些位于我旧的“node_modules”文件夹中。

我可以将这些模块/文件夹(来自旧的“node_modules”)复制到我的新项目中吗?我是否需要更新“package.json”或使用“react-native 链接 xxxxx”的链接?理论上就这么简单?

【问题讨论】:

  • 不确定我是否正确理解了您的问题,但理论上您所要做的就是将您的 package.json 复制/粘贴到您的新项目中并运行 npm install

标签: javascript reactjs react-native


【解决方案1】:

您不需要复制您的node_modules 目录。如果您愿意,可以,但这不是最佳实践。在任何情况下,您都不应该对node_modules 中的文件进行任何修改。

您最好只复制您的package.json 文件和可选的package-lock.json(或yarn.lock,如果您使用Yarn)文件,以便您的项目可以在其他计算机上轻松安装和升级。

当您有package.jsonpackage-lock.json 文件时,您可以运行npm install(或yarn install)将软件包安装到您的node_modules 目录。

同时复制您的package-lock.json 文件将确保您在之前项目中安装的所有软件包的完全相同版本也将安装在新项目中。有关package-lock.json 文件的更多信息,请参阅this

不幸的是,我对 react-native 和链接 react-native 依赖项了解不多,但从 this answer 看来,您必须在运行 npm install 后再次链接任何包含本机代码的依赖项.

【讨论】:

  • 好的。所以我不需要复制包文件夹,你是说通过复制我的 yarn.lock 文件并运行“yarn add react-native-module-xx”它会获取并安装这些?
  • 如果你复制你的yarn.lock文件和你需要的所有依赖,你只需要运行yarn install,所有的依赖都会被安装。无需为每个包运行yarn add <package-name>
【解决方案2】:

不,我不建议您从 node_modules 文件夹中复制特定模块,因为一旦安装,它在 .bin 文件夹和文件中就有条目,您在复制时会错过这些条目,并且在新项目中将没有任何帮助,因为它们将是由于缺少索引,重新下载并安装。

解决方案:

  • 如果您确定其中的依赖项版本完全兼容或您想要的版本,您可以在另一个项目中使用相同的 package.json 和 package-lock,然后在新项目中安装这些依赖项。 package-lock.json 将确保您选择的版本。

  • 是的,您可以将 whole node_modules(已多次完成)从一个项目复制到另一个项目并使用相同的 package.json 和 package-lock(只会在依赖项安装中节省时间/下载)

当您重新开始时,我建议创建一个新的 package.json 并仅复制对项目初始化很重要的依赖项,并随着您的进展添加开发时需要的特定依赖项.这将使您免于大量未使用的依赖项垃圾,一旦项目膨胀,这些依赖项就很难跟踪。

【讨论】:

  • 嗨 Vikas,所以我的新 package.json 文件非常空,从我的旧 package.json 文件中,我知道我有 8 个依赖项要添加。那么我可以将例如'react-native-fetch-blob'文件夹从旧的node_modules复制到新的node_modules文件夹并运行'npm install react-native-fetch-blob'吗?
  • 你可以复制,但它没有用,它就像复制“react-native-fetch-blob”的 package.json 条目并执行 npm install 一样简单。如果您想要特定版本,也可以执行“npm install react-native-fetch-blob@”,否则将安装最新版本。
  • 不一定,一旦版本匹配,只需从 package.json "react-native-fetch-blob" 和 "react-native" 版本中删除 ^。在 npm install 之后,您不必一次又一次地链接,这完全与兼容性有关。 :-)
  • 现在 package.json 中有不少 ^。是否应该在 npm 安装之前删除它们?
  • package-lock 会处理这个问题,但是如果您想从自己的角度确定并且不与其他贡献者共享 package-lock,那么您应该仅从链接依赖项中删除 ^。注意:随着您的进展并决定升级到更高版本的 react,请记住,您应该手动更新这些链接并再次链接(您可能希望稍后升级,因为较新的库需要较新版本的框架)。 ^ 只是指示 npm 安装最新/更好的版本(如果可用)。
【解决方案3】:

也许你可以移动它但你不能复制它,至少不能用一个天真的cp -r! node_modules/.bin 目录应该包含指向 node_moudles 中各自目录中脚本的符号链接,但在 cp -r 之后,这些将是副本,现在将错误地解析相对模块路径。

例如,npm install typescript 安装一个包含内容的可执行脚本

#!/usr/bin/env node
require('../lib/tsc.js')

在两个位置。在复制之前,它看起来像这样:

$ ls -l node_modules/.bin/tsc node_modules/typescript/bin/tsc
-rwxr-xr-x 45 node_modules/.bin/tsc
-rwxr-xr-x 45 node_modules/typescript/bin/tsc

cp -r 复制之后,像这样:

$ ls -l node_modules/.bin/tsc node_modules/typescript/bin/tsc
lrwxr-xr-x 21 node_modules/.bin/tsc -> ../typescript/bin/tsc
-rwxr-xr-x 45 node_modules/typescript/bin/tsc

这使得 ../typescript/bin/tsc 不再存在,导致

$ tsc -b
...
Error: Cannot find module '../lib/tsc.js'
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多