Node.js 将节点_模块安装到供应商

Node.js 将节点_模块安装到供应商,node.js,npm,node-modules,Node.js,Npm,Node Modules,如何将每个项目的npm模块本地安装到vendor/node_modules并使package.json文件看到它们 我不想将package.json移动到供应商文件夹 我有bower,在.bowerrc中我指定了bower\u组件路径-这非常简单 我怎样才能用npm做到这一点 我已经阅读了文件,npmrc文件,这里的一些问题,谷歌搜索,浪费了一个多小时——仍然没有运气。对于这样一项简单的任务来说,这是非常困难的 我不在乎缺点,只要告诉我最后怎么做就行了。你不能,不使用内置的npm功能。 在npm

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

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

我有bower,在
.bowerrc
中我指定了
bower\u组件
路径-这非常简单

我怎样才能用npm做到这一点

我已经阅读了文件,npmrc文件,这里的一些问题,谷歌搜索,浪费了一个多小时——仍然没有运气。对于这样一项简单的任务来说,这是非常困难的


我不在乎缺点,只要告诉我最后怎么做就行了。

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

在npm github上,存储库涵盖了这个问题。这也是他们常见问题的一部分


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

对于似乎没有内置方法安装到任意子文件夹中的
节点模块
文件夹感到沮丧,我用以下两个脚本想出了一个巧妙的解决方案:

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){}
var fs = require("fs");
try
{
    if(process.platform.indexOf("win32") !== -1)
    {
        fs.unlinkSync("./node_modules/");
    }
    else
    {
        fs.unlinkSync("./node_modules");
    }
}
catch(e){}
postinstall.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){}
var fs = require("fs");
try
{
    if(process.platform.indexOf("win32") !== -1)
    {
        fs.unlinkSync("./node_modules/");
    }
    else
    {
        fs.unlinkSync("./node_modules");
    }
}
catch(e){}
您只需将它们添加到
scripts
选项中,即可在
package.json
文件中使用它们:

"scripts": {
    "preinstall": "node preinstall.js",
    "postinstall": "node postinstall.js"
},
所以,最大的问题是:它能做什么

  • 嗯,当您调用
    npm install
    时,将触发
    preinstall.js
    脚本,它将在您想要的子文件夹中创建一个
    node\u modules
    。然后,它从
    node\u模块
    创建
    symlink
    或(
    shortcut
    ,在Windows中),而
    npm
    期望将其创建到真实的
    node\u模块

  • 然后
    npm
    安装所有依赖项

  • 最后,一旦安装了所有依赖项,就会启动
    postinstall.js
    脚本,删除
    symlink


  • 这是一个方便的工具,里面有你所需要的一切。

    你不能
    npm
    使用node的算法查找软件包,详细说明如下:您必须修改
    node
    二进制文件以支持“供应商/节点\u模块”,这是正确的,但npm也不会安装到自定义目录。您可以提供一条路径,以便在node遍历各个node_模块位置之前使用……但npm仍然不会安装node_模块以外的任何位置。因此,从技术上讲,您可以不使用npm编写一个节点项目,但您必须为每个需求对每个路径进行硬编码。您刚刚用符号链接的想法节省了我的时间,这在我的用例中非常有效(在许多项目中使用相同的模块,因此硬链接整个node_模块目录非常有效)。这对node_模块非常有效,但是现在我的gulpfile.js抱怨没有安装本地gulp,除非我通过不运行postinstall来保留符号链接。js在这种情况下有没有让gulpfile.js执行的方法?@BradBamford,在删除符号链接之前,您可以修改
    postinstall
    脚本以调用
    gulp