【问题标题】:Specify path to node_modules in package.json在 package.json 中指定 node_modules 的路径
【发布时间】:2014-12-05 05:55:58
【问题描述】:

有没有办法移动应用程序中的 node_modules 目录,让我们说 /vendor/node_modules 就像 bower 对 bowerrc 文件所做的那样?我认为它可以在 package.json 中指定,但我似乎找不到解决方案。非常感谢您的帮助。

【问题讨论】:

  • 我不确定您为什么接受了一个显然无法回答您问题的答案。您问如何在package.json 中设置node_modules 的路径,而xShirase 的回答根本没有提供这样做的方法。
  • 他可能接受了这个答案,因为这显然是一个XY problem,并且替代解决方案比“抱歉,这不可能”更好。

标签: node.js npm


【解决方案1】:

可以,只需设置 NODE_PATH 环境变量:

export NODE_PATH='yourdir'/node_modules

根据文档:

如果 NODE_PATH 环境变量设置为以冒号分隔的列表 绝对路径,然后节点将在这些路径中搜索模块,如果 它们在其他地方找不到。 (注意:在 Windows 上,NODE_PATH 是 用分号而不是冒号分隔。)

另外,节点会在以下位置进行搜索:

1: $HOME/.node_modules

2: $HOME/.node_libraries

3: $PREFIX/lib/node

其中 $HOME 是用户的主目录,$PREFIX 是节点的 配置node_prefix。

这些主要是出于历史原因。 我们强烈建议您 将您的依赖项本地放置在 node_modules 文件夹中。 它们将是 加载速度更快,更可靠。

Source

【讨论】:

  • 太好了。因此,在我正在构建的每个应用程序都有本地 node_modules 的情况下,我会在项目的 js 文件中进行导出吗?
  • 不,它是一个环境变量,它是在系统级别设置的。因此,您必须在终端中输入它。在 process.env 的节点应用程序中访问 env 变量
  • 我尝试在 Windows 中运行它,但它不起作用,它说:'export' is not recognized as an internal or external command, operable program or batch file.,它在 OS X 中对我有用。
  • 我真的不认为这是问题的答案:他在 package.json 中要求一个属性来放置 LOCAL(应用程序级别)npm-Packages 的路径。这个答案告诉他如何将 GLOBALLY (-g) 安装的包移动到另一个文件夹中。
  • 没有“财产”一词或其标题。作者写I thought it could在package.json中。但是您可以在脚本运行命令中指定 package.json 中的环境变量,如下所示:{"scripts": { "start": "NODE_PATH='yourdir'/node_modules node ./your-app.js"}} 您也可以使用 shell 的所有扩展能力。
【解决方案2】:

简而言之:这是不可能的,而且似乎永远不会被支持(见这里https://github.com/npm/npm/issues/775)。

使用 CLI 或 ENV-Variables(请参阅当前选择的答案)、.npmrc-Config-Files 或 npm link 有一些 hacky work-arrounds - 它们都有一个共同点:它们不仅仅是项目 -具体的,但总是某种global 解决方案。

对我来说,这些解决方案都不是真正干净的,因为您的项目的贡献者总是需要创建一些特殊的配置或具有一些特殊的知识 - 他们不能只是 npm install 并且它有效。

所以:要么你必须将你的 package.json 放在你想要安装 node_modules 的同一个目录中,要么接受它们总是在你项目的根目录中的事实。

【讨论】:

  • “如果你想用不同的方式拼写“node_modules”,对不起,没办法。这是内置在 node-core 中的。改变它就等于构建一个完全不同的包管理器。
  • 2019 年的评论:看起来 yarn 支持覆盖模块目录。好吧,我想,yarn 是一个新的包管理器。
【解决方案3】:

Yarn 支持此功能:

# .yarnrc file in project root
--modules-folder /node_modules

但您的体验可能会因您使用的软件包而异。我不确定你是否想进入那个兔子洞。

【讨论】:

    【解决方案4】:

    我不确定这是否是您的想法,但我最终提出了这个问题,因为我无法在我的项目目录中安装 node_modules,因为它安装在不支持符号链接的文件系统上( VM“共享”文件夹)。

    我找到了以下解决方法:

    1. package.json 文件复制到不同文件系统上的临时文件夹中
    2. 在那里运行npm install
    3. 将生成的node_modules 目录复制回项目目录,使用cp -r --dereference 将符号链接展开为副本。

    我希望这可以帮助其他在寻找将node_modules 移动到不同文件系统的方法时最终解决这个问题的人。

    其他选项

    还有另一种解决方法,即I found on the github issue that @Charminbear linked to,但这不适用于grunt,因为它不支持NODE_PATH,正如https://github.com/browserify/resolve/issues/136

    假设您有 /media/sf_shared 并且您无法在其中安装符号链接 那里,这意味着你实际上不能 npm install from /media/sf_shared/myproject 因为某些模块使用符号链接。

    • $ mkdir /home/dan/myproject && cd /home/dan/myproject
    • $ ln -s /media/sf_shared/myproject/package.json(您可以在此符号链接 方向,只是无法在 /media/sf_shared 内部创建一个)
    • $ npm install
    • $ cd /media/sf_shared/myproject
    • $ NODE_PATH=/home/dan/myproject/node_modules node index.js

    【讨论】:

      【解决方案5】:

      如果我在 docker 中并且我想将 node_modules 保留在一个卷中怎么办?然后,在我的应用程序路径中包含 node_modules 对我来说不是一个选项。

      当我将新代码部署到容器中时,我将 tar 放入其中,将其解压缩到一个临时文件夹,然后从该文件夹 rsync 到 app 目录。我为 rsync 设置了 --delete 标志,因此 tar 中没有的所有内容都将从 app 文件夹中删除。这也适用于node_modules 文件夹,所以不幸的是,唯一对我有用的解决方案如下:

      在 app 目录中创建指向包含 node_modules 的目录的符号链接,并从主机挂载到容器中。

      【讨论】:

        猜你喜欢
        • 2016-08-27
        • 2016-09-01
        • 1970-01-01
        • 2022-01-15
        • 2021-01-05
        • 2018-10-28
        • 2021-10-29
        • 1970-01-01
        • 2021-12-16
        相关资源
        最近更新 更多