npm 从父目录安装

Posted

技术标签:

【中文标题】npm 从父目录安装【英文标题】:npm install from the parent directory 【发布时间】:2016-11-01 16:04:13 【问题描述】:

我有一个这样的目录结构:/a/b/c

目录c 包含package.json 并且应该包含node_modules。 如何从内部目录a 执行npm install

我尝试过这种方式:npm --prefix b/c install b/c,但这种方式,所有符号链接都直接在 c 内部创建,而不是默认的 node_modules/.bin

有什么方法可以实现吗?

节点:6.2.2 npm: 3.10.2

【问题讨论】:

我不这么认为。当前的工作目录概念不允许。可能 node.js 需要函数停止这个。 我也在考虑如果无法通过package.json的路径是否有任何解决方法。也许 /a 中有一个额外的 package.json 文件,带有自定义“npm run”来启动一个进程,将目录更改为 /a/b/c 并运行“npm install”? 【参考方案1】:

在您的a 目录中的package.json 中使用npm pre install hook 可能是这种情况下的最佳选择。

scripts: 
    preinstall: `cd b/c && npm install`

这种在a 目录中运行npm install 的方式也将安装c 目录并提供无缝的开发体验。

【讨论】:

【参考方案2】:

有点矫枉过正,但可能有用...

在递归的帮助下你可以找到node_modules

您可以在父目录中运行此文件以在子目录中找到 node_modules 并传递 npm 参数。

注意:在 Windows 上测试

var child_process = require('child_process');
var fs = require('fs');
var path = require('path');
var safe = 0;

let args = process.argv.splice(2).toString().replace(/,/g ,' ');
function recurse(_path)
safe ++;
if(safe > 5000)
  console.log('directory may be too large')
  return


  if(/node_modules$/.test(_path))
    let cwd = path.resolve(__dirname ,_path)
    console.log('found node_modules at '+cwd)
    child_process.exec(`start cmd.exe /k npm $args`,cwd)

    return
  
  let directoryList = fs.readdirSync(_path);
    directoryList.forEach(function(nextDir)
    if(fs.statSync(_path+'/'+nextDir).isFile())
      return

    
    if(/^\./.test(nextDir)) //.folder beginging with .
      return
    
    recurse(_path+'/'+nextDir);

  )

recurse('./' )

【讨论】:

这个脚本对于在嵌套目录中运行其他 npm 调用肯定很有用,但是这种方法仍然需要您在 c 目录中将初始 npm install 作为 node_modules 目录最初不存在。

以上是关于npm 从父目录安装的主要内容,如果未能解决你的问题,请参考以下文章

设置npm安装模块目录<nodejs>

npm install 后缀

如何查看npm配置?

npm

npm全局模块卸载及默认安装目录修改

修改 npm 全局安装目录