2016-06-29 4 views
4

У меня есть структура каталогов вроде этого: /a/b/cНПХ установка из родительского каталога

Справочника c содержит package.json и должен содержать node_modules.
Как я могу выполнить npm install изнутри каталога a?

Я пробовал этот путь: npm --prefix b/c install b/c, но таким образом все символические ссылки создаются непосредственно внутри c вместо значения по умолчанию node_modules/.bin.

Есть ли способ достичь этого?

узел: 6.2.2
НПМ: 3.10.2

+0

Я не думаю, что так. текущие концепции рабочего каталога не позволяют. Вероятно, node.js требует, чтобы функция останавливала это. –

+0

Я также думал о том, если есть какие-либо обходные пути, если невозможно передать путь package.json. Возможно, дополнительный файл package.json в/a с пользовательским «npm run», чтобы запустить процесс, сменить каталог на/a/b/c и запустить «npm install»? – Zygimantas

ответ

6

Использование НПМ предварительно установить крюк в package.json в вашем a каталоге, вероятно, лучший выбор в этой ситуации.

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

Этот способ работает npm install в каталоге a будет также сделать каталог c установить и обеспечить плавный опыт Dev.

1

Немного излишеством, но может быть полезно ...

С помощью рекурсии вы можете найти 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('./')

+0

Этот сценарий может быть определенно полезен для запуска других вызовов npm во вложенных каталогах, но этот подход по-прежнему потребует от вас выполнить начальную «npm install» в каталоге 'c', поскольку каталог' node_modules' изначально не существует. –