Node.js 将节点_模块安装到供应商
如何将每个项目的npm模块本地安装到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
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
。