2015-01-04 30 views
8

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

我不想动的package.json给供应商的文件夹

我有凉亭和.bowerrc我指定的bower_components路径 - 这是超级容易。

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

我已经阅读了docs,npmrc docs,这里有一些问题,用google搜索了一个多小时 - 还是没有运气。这对于这样一个简单的任务来说是非常困难的。

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

回答

2

您不能使用内置的npm功能。

This discussion关于npm的github存储库涵盖了这个问题。这也是this answer,这是他们的FAQ的一部分。

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

+0

**你不能** 'npm'使用节点查找包的算法,这里详细说明: 你将不得不修改'节点'二进制文件为了支持“vendor/node_modules” – 2015-01-04 12:24:34

+0

这是真的,但npm也不会安装到自定义目录。您可以提供一个路径,以便在节点遍历各个node_modules位置之前要求使用....但npm仍然不会安装任何位置,而是安装node_modules。所以你可以在技术上编写一个不使用npm的节点项目,但是你必须为每个需求硬编码每个路径。 – 2015-01-04 13:49:00

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){} 

postinstall.js

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" 
}, 

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

  1. 那么,当你调用npm install它创建你想要的子文件夹node_modulespreinstall.js脚本火灾。然后它会从node_modules创建一个symlink或(shortcut在Windows中),npm期望为node_modules

  2. Then npm安装所有依赖项。

  3. 最后,一旦安装了所有的依赖关系,脚本将启动postinstall.js,从而删除symlink

这里有一个方便的gist与所有你需要的。

+1

你刚刚用符号链接的想法保存了我的一天,这对我的用例非常有用(在许多项目中使用相同的模块,因此很难链接整个node_modules目录,就像一个魅力一样)。 – 2016-02-19 22:41:08

+0

绝对精彩! – 2016-10-29 15:44:18

+0

这适用于node_modules,但现在我的gulpfile.js抱怨没有安装本地gulp,除非我通过不运行postinstall.js来保留符号链接 有没有办法让gulpfile.js在这种情况下执行? – 2016-10-29 17:23:40

相关问题