2013-04-11 7 views

Odpowiedz

81

Programowo można używać programu npm i został opisany w starszych wersjach dokumentacji. Od tego czasu zostały usunięte z oficjalnej dokumentacji, ale nadal istnieje na kontroli źródła z następującym stwierdzeniem:

Chociaż npm mogą być używane programowo, jego API jest przeznaczona do stosowania przez tylko CLI i żadne gwarancje wykonane w odniesieniu do jego przydatności do dowolnego innego celu. Jeśli chcesz użyć npm do niezawodnie wykonać jakieś zadanie, najbezpieczniejszą rzeczą do zrobienia jest wywołanie pożądanego polecenia npm z odpowiednich argumentów.

Semantyczna wersja npm odnosi się do samego CLI, a nie do bazowego interfejsu API . Wewnętrzny interfejs API nie ma gwarancji, że pozostanie stabilny , nawet jeśli wersja programu wskazuje, że nie dokonano żadnych zmian w zakresie łamania zabezpieczeń, zgodnie z kodem zgodnie z semver.

W oryginalnej dokumentacji, oto próbka kodu, który został dostarczony:

var npm = require('npm') 
npm.load(myConfigObject, function (er) { 
    if (er) return handlError(er) 
    npm.commands.install(['some', 'args'], function (er, data) { 
    if (er) return commandFailed(er) 
    // command succeeded, and data might have some info 
    }) 
    npm.registry.log.on('log', function (message) { ... }) 
}) 

Od npm istnieje w folderze node_modules, można użyć require('npm') załadować go jak każdy inny moduł. Aby zainstalować moduł, będziesz chciał użyć npm.commands.install().

Jeśli potrzebujesz zajrzeć do źródła, to jest również na GitHub. Oto pełna przykładów pracy z kodem, który jest równoważny z systemem npm install bez żadnych argumentów wiersza poleceń:

var npm = require('npm'); 
npm.load(function(err) { 
    // handle errors 

    // install module ffi 
    npm.commands.install(['ffi'], function(er, data) { 
    // log errors or data 
    }); 

    npm.on('log', function(message) { 
    // log installation progress 
    console.log(message); 
    }); 
}); 

Zauważ, że pierwszy argument funkcji instalacji jest tablicą. Każdy element tablicy jest modułem, który próbuje zainstalować npm.

Bardziej zaawansowane użycie można znaleźć w pliku npm-cli.js na kontrolerze źródłowym.

+4

w przypadku, gdy to pomoże każdemu - upewnij się, że najpierw zrobisz 'npm install npm --save'. Przykład działa świetnie :) – mikermcneil

+3

Pamiętaj też - 'npm' ma wiele zależności, więc dodanie go do twojego modułu najprawdopodobniej spowoduje, że pobieranie będzie trwało DUŻO. Sprawdź jedną z odpowiedzi 'child_process', aby wykorzystać globalny npm już zainstalowany na komputerach użytkowników. – mikermcneil

+0

Nie przekazuj 'npm.config' do' npm.load'! Nawet @isaacs nie wie, jakie dziwne rzeczy się wydarzy! Zobacz https://github.com/npm/npm/issues/4861#issuecomment-40533836 Zamiast tego możesz po prostu pominąć pierwszy argument. –

17

tak. można użyć child_process wykonać polecenia systemowego

var exec = require('child_process').exec, 
    child; 

child = exec('npm install ffi', 
function (error, stdout, stderr) { 
    console.log('stdout: ' + stdout); 
    console.log('stderr: ' + stderr); 
    if (error !== null) { 
      console.log('exec error: ' + error); 
    } 
}); 
+2

Tak, możesz, jednak niektóre zależności NIE BĘDĄ instalowane (mówienie z doświadczenia, ponieważ dawno temu faktycznie napisałem serwer [CI] (https://github.com/matejkramny/node-ci) dla node.js) –

+3

W systemie Windows to nie działa! Zamiast tego musisz wywołać 'npm.cmd'. – DUzun

5

może rzeczywiście być trochę łatwy

var exec = require('child_process').exec; 
child = exec('npm install ffi').stderr.pipe(process.stderr); 
+1

Ma to również tę zaletę, że stderr (i stdout) są drukowane tak, jak się pojawiają, a nie na końcu wykonywania! – mvermand

8

jeśli chcesz mieć wyjścia jak dobrze można użyć:

var child_process = require('child_process'); 
child_process.execSync("npm install ffi",{stdio:[0,1,2]}); 

to sposób, w jaki można oglądać instalację, tak jak robisz to pod ręką i unikasz złych niespodzianek (bufor pełny, itp.)

1

Miałem sporo czasu próbując dostać pierwszy przykład do pracy w katalogu projektu, zamieszczając tutaj na wypadek, gdyby ktoś inny to znalazł.O ile mogę powiedzieć, NPM nadal działa prawidłowo załadowany bezpośrednio, ale dlatego, że zakłada, CLI, musimy powtarzać sobie trochę ustawienie go:

// this must come before load to set your project directory 
var previous = process.cwd(); 
process.chdir(project); 

// this is the part missing from the example above 
var conf = {'bin-links': false, verbose: true, prefix: project} 

// this is all mostly the same 

var cli = require('npm'); 
cli.load(conf, (err) => { 
    // handle errors 
    if(err) { 
     return reject(err); 
    } 

    // install module 
    cli.commands.install(['ffi'], (er, data) => { 
     process.chdir(previous); 
     if(err) { 
      reject(err); 
     } 
     // log errors or data 
     resolve(data); 
    }); 

    cli.on('log', (message) => { 
     // log installation progress 
     console.log(message); 
    }); 
}); 
0

Jestem autorem modułu, które pozwalają zrobić dokładnie to, co masz na myśli. Zobacz live-plugin-manager.

Możesz zainstalować i uruchomić praktycznie dowolny pakiet z NPM, Github lub z folderu.

Oto przykład:

import {PluginManager} from "live-plugin-manager"; 

const manager = new PluginManager(); 

async function run() { 
    await manager.install("moment"); 

    const moment = manager.require("moment"); 
    console.log(moment().format()); 

    await manager.uninstall("moment"); 
} 

run(); 

W powyższym kodzie zainstalować moment pakiet w czasie wykonywania, obciążenia i wykonać ją. Na koniec odinstalowuję to.

Wewnętrznie Nie uruchamiam programu npm cli, ale w rzeczywistości pobieraję pakiety i uruchamiam w obszarze izolowanym maszyny wirtualnej VM.

Powiązane problemy