Czy mogę zainstalować pakiet NPM z pliku javascript działającego w Node.js? Na przykład chciałbym mieć skrypt, nazwijmy go "script.js", który w jakiś sposób (... używając NPM lub nie ...) instaluje pakiet zwykle dostępny przez NPM. W tym przykładzie chciałbym zainstalować "FFI". (npm install ffi)Czy mogę zainstalować pakiet NPM z javascript działającego w Node.js?
Odpowiedz
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.
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);
}
});
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) –
W systemie Windows to nie działa! Zamiast tego musisz wywołać 'npm.cmd'. – DUzun
może rzeczywiście być trochę łatwy
var exec = require('child_process').exec;
child = exec('npm install ffi').stderr.pipe(process.stderr);
Ma to również tę zaletę, że stderr (i stdout) są drukowane tak, jak się pojawiają, a nie na końcu wykonywania! – mvermand
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.)
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);
});
});
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.
- 1. Czy mogę napisać pakiet npm w coffeescript?
- 2. pakiet nodejs npm | Problem z linkiem npm
- 3. Instalacja pakiet Socket.io w node.js
- 4. Node.js/npm - czy mimo to stwierdzić, czy pakiet jest czystym JS czy nie?
- 5. Pakiet instalacyjny npm z podfolderu gitub repo
- 6. Wychodzenie z działającego serwera Node.js w Linuksie
- 7. Czy muszę zainstalować moduł kryptograficzny z npm?
- 8. Czy można zainstalować plik node.js w IIS7?
- 9. Jak zaktualizować pakiet npm z lokalnego folderu
- 10. npm zainstalować w podfolderze
- 11. nie można zainstalować npm w pojemniku dokowania?
- 12. npm zainstalować child_process nie działa
- 13. Jak zainstalować pakiet Python z GitHub?
- 14. NPM pakiet „bin” skrypt dla Windows
- 15. npm zainstalować bez ssl
- 16. napar zainstalować npm "npm: polecenie nie znalezione"
- 17. Pomoc wymagająca moduł npm w node.js
- 18. npm zainstalować nie działa
- 19. Jak zainstalować pakiet z github repo w Przędzy
- 20. NPM - Nie można zainstalować socket.IO
- 21. npm zainstalować z podfolderu git repo
- 22. Prywatny NPM: Jak zainstalować najnowszą wersję modułu?
- 23. Jak mogę zaktualizować moduł npm kątomierza w pliku node.js?
- 24. node.js npm install fs error
- 25. Czy mogę pobrać IDFA iOS6 z Javascript?
- 26. Jak mogę zainstalować pakiet XGBoost w pythonie na Windows
- 27. Docker: npm zainstalować za pełnomocnika
- 28. Nie można zainstalować pakiet weterynarz z idź
- 29. Nie mogę npm zainstalować zależności podczas budowania obrazu dokowania
- 30. zainstalować pakiet stary korzystania install.packages
w przypadku, gdy to pomoże każdemu - upewnij się, że najpierw zrobisz 'npm install npm --save'. Przykład działa świetnie :) – mikermcneil
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
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. –