【问题标题】:Install node_modules to vendor将 node_modules 安装到供应商
【发布时间】:2015-03-02 02:46:38
【问题描述】:

如何将每个项目的 npm 模块本地安装到 vendor/node_modules 并让 package.json 文件看到它们。

我不想将 package.json 移动到供应商文件夹

我有凉亭,并在 .bowerrc 中指定 bower_components 路径 - 这非常简单。

如何使用 npm 做到这一点?

我已经阅读了文档,npmrc 文档,这里有一些问题,谷歌搜索,浪费了一个多小时 - 仍然没有运气。对于这么简单的任务来说,这太难了。

我不在乎缺点,最后告诉我该怎么做。

【问题讨论】:

    标签: node.js npm node-modules


    【解决方案1】:

    你不能,不使用内置的 npm 功能。

    npm github 存储库上的This discussion 涵盖了该问题。 this answer 也解决了这个问题,这是他们的常见问题解答的一部分。

    您仍然可以通过将模块复制到您的/vendor 目录然后使用require("./vendor/whatever") 语法调用它们来“手动”安装...但这意味着每个require 都需要使用您的新自定义位置。有几种方法可以处理此问题,但它们都意味着您需要在源代码中做额外的工作以适应自定义位置。

    【讨论】:

    • 你不能。 npm 使用 node 的算法来查找包,详细在这里:nodejs.org/api/…> 你必须修改你的 node 二进制文件才能支持“供应商/node_modules”
    • 没错,但 npm 也不会安装到自定义目录。您可以提供一条在 node 遍历各种 node_modules 位置之前将使用的路径....但是 npm 仍然不会安装 node_modules 以外的任何地方。因此,从技术上讲,您可以在不使用 npm 的情况下编写节点项目,但您必须为每个需求硬编码每个路径。
    【解决方案2】:

    对于似乎没有内置方法可以安装到任意子文件夹中的 node_modules 文件夹这一事实感到沮丧,我想出了一个使用以下两个脚本的偷偷摸摸的解决方案:

    preinstall.js

    var fs = require("fs");
    try
    {
        fs.mkdirSync("./app/node_modules/");
    }
    catch(e)
    {
    }
    
    try
    {
        if(process.platform.indexOf("win32") !== -1)
        {
            fs.symlinkSync("./app/node_modules/","./node_modules/","junction");
        }
        else
        {
            fs.symlinkSync("./app/node_modules/","./node_modules","dir");
        }
    }
    catch(e){}
    

    postinstall.js

    var fs = require("fs");
    try
    {
        if(process.platform.indexOf("win32") !== -1)
        {
            fs.unlinkSync("./node_modules/");
        }
        else
        {
            fs.unlinkSync("./node_modules");
        }
    }
    catch(e){}
    

    您需要做的就是在您的package.json 文件中使用它们,方法是将它们添加到scripts 选项中:

    "scripts": {
        "preinstall": "node preinstall.js",
        "postinstall": "node postinstall.js"
    },
    

    那么,最大的问题是:它有什么作用?

    1. 好吧,当您调用 npm install 时,preinstall.js 脚本会触发,它会在您想要的子文件夹中创建一个 node_modules。然后它从npm 期望的node_modules 到真正的node_modules 创建一个symlink 或(Windows 中的shortcut)。

    2. 然后npm 安装所有依赖项。

    3. 最后,一旦安装了所有依赖项,postinstall.js 脚本就会触发,该脚本会删除 symlink!

    这里有一个方便的gist,里面有你需要的一切。

    【讨论】:

    • 你刚刚用符号链接的想法拯救了我的一天,这对我的用例很有效(在许多项目中使用相同的模块,所以很难链接整个 node_modules 目录就像一个魅力)。
    • 这对 node_modules 很有用,但是现在我的 gulpfile.js 抱怨没有安装本地 gulp,除非我通过不运行 postinstall.js 来保留符号链接 无论如何要让 gulpfile.js 在此执行场景?
    • @BradBamford,您可以在删除符号链接之前修改postinstall 脚本以使用child_process.exec 调用gulp
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多