将node_modules安装到供应商

moz*_*ozg 8 node.js npm node-modules

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

我不想将package.json移动到vendor文件夹

我有凉亭,在.bowerrc我指定bower_components路径 - 这是非常容易的.

我怎么能用npm做到这一点?

我已经阅读了文档,npmrc文档,这里的一些问题,Google搜索,浪费了一个多小时 - 仍然没有运气.这对于如此简单的任务来说非常困难.

我不关心弊端,最后告诉我该怎么做.

Hay*_*yun 9

由于似乎没有内置的方法安装到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){}
Run Code Online (Sandbox Code Playgroud)

postinstall.js

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

您只需将它们package.json添加到scripts选项中即可在文件中使用它们:

"scripts": {
    "preinstall": "node preinstall.js",
    "postinstall": "node postinstall.js"
},
Run Code Online (Sandbox Code Playgroud)

所以,最大的问题是:它做了什么?

  1. 那么,当你调用npm installpreinstall.js它创建一个脚本触发node_modules你想要的子文件夹.然后,它会创建一个symlink或(shortcut在Windows中)node_modulesnpm预计到真实node_modules.

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

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

这是一个方便的要点,你需要的一切.


Mat*_*tis 4

如果不使用内置的 npm 功能,则不能。

npm github 存储库上的讨论涵盖了这个问题。这个答案也解决了这个问题,这是他们常见问题解答的一部分。

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