Komut satırından komut dosyasında işlevi çalıştırma (Düğüm JS)


209

Düğümde bir web uygulaması yazıyorum. İçinde db.jsbir işlev initbulunan bazı JS dosyası varsa , komut satırından bu işlevi nasıl çağırabilirim?


npm run-func kullanın stackoverflow.com/a/43598047/696535
Pawel

3
@Pawel Kabul edilen yanıtı tercih ediyorum, çünkü desteği kaybedebilecek veya güvenlik açıkları içerebilecek bir üçüncü taraf bağımlılığı yüklemeyi gerektirmiyor. Herhangi bir bağımlılıkla karşılaştığınız bir risktir, bu nedenle bağımlılıkları iyi denetlenmiş ve sürdürülmüş olanlarla sınırlamak her zaman iyi bir fikirdir.
winhowes

Yanıtlar:


337

Bunu neden yapmak istediğinize veya daha standart bir uygulama olabileceğine dair bir yorum yok: işte sorunuza bir çözüm .... Komut satırınız için gereken teklif türünün değişebileceğini unutmayın.

Bölümünde işlevi db.jsdışa aktarın init. Birçok yol var, ancak örneğin:

module.exports.init = function () {
  console.log('hi');
};

Ardından db.js, komut isteminizle aynı dizinde olduğunu varsayarak bunu şöyle çağırın :

node -e 'require("./db").init()'

Diğer okuyucular için, OP'nin initişlevi herhangi bir şey olarak adlandırılmış olabilir, önemli değil, sadece soruda kullanılan özel addır.


80
Bu AWS lambda'dan çalışan bazı javascript'i test etmek için yararlı bir ipucuydu - teşekkürler
Alex Hinton

14
İşlev zaman uyumsuzsa ne olur?
Augustin Riedinger

24
Başka kimse kendi paketi.json bunu bir npm komut dosyası olarak yapmaya çalışıyorsa, ben tek tırnak ve içinde çift tırnak ile denedim, ama onları değiştirene kadar işe yaramadı: "start": "node - e \ "gerektirir ('./ sunucu') () \" ",
Sako73

2
Cevabınız için @winhowes'a teşekkürler, sadece örneğinizi kullandım module.exports.init = function () { console.log('hi'); };Ve bir node -e 'require("./db").init()'şekilde benim için çalışmadı. Neyi yanlış yaptığımdan emin değilim, ama fikrinizi takip ederek kullandım module.exports = myFunction, ve sonra node -e 'require("./myFunction")()'benim için çalıştım.
C.Lee

3
AlexHinton yorumuna @ bir büyütme olarak, şimdi bir etkinlik ve geri arama taklit eden için aşağıdaki kullanın: node -e 'require("./index").handler(require("./fixtures/sample_event_01.json"), {}, console.log)'. Orta {}bağlam olurdu, ayarlamaktan çekinmeyin. Ayrıca console.log biraz ilkel ama güzel bir başlangıç. Tabii ki diğer yorumlarda belirtildiği gibi index) / handler () 'ı gerektiren bir özel CLI.js yazabilirsiniz.
Adrian Föder

52

Diğer cevaplara göre aşağıdakileri ekleyin: someFile.js

module.exports.someFunction = function () {
  console.log('hi');
};

Daha sonra aşağıdakileri ekleyebilirsiniz: package.json

"scripts": {
   "myScript": "node -e 'require(\"./someFile\").someFunction()'"
}

Terminalden, daha sonra

npm run myScript

Bunu komutları hatırlamanın ve kullanmanın çok daha kolay bir yolunu buluyorum


Win10 makinemde, bu sözdizimi komut dosyasını yankılanıyor (bir PowerShell veya Komut İstemi terminalinde). 'Npm run' yerine doğrudan çalıştırılması, requir parametresinin başlangıcına işaret eden 'Beklenmeyen simge' atar. Henüz nasıl çalıştıracağını anlayamadım.
CalvinDale

@CalvinDale burada aynısı powershell sadece iyi çalıştırabilirsiniz dışında.
ferr

3
Makinemde (Windows 10), çift ve tek tırnakları değiştirmek zorunda kaldım, şöyle: "myScript": "düğüm -e \" gerektirir ('./ someFile'). SomeFunction () \ "" Aksi takdirde Düğüm komutu tek tırnak içine alın, ancak değerlendirmeyin. Belki bu @CalvinDale ve ferr sorunlarını çözer.
Christoph

4
İşlev çağrısına bağımsız değişken eklemek istiyorsak ne olur?
Miguel Stevens


19

Doğrudan CLI'den (global) çalıştır

Yüklemek

npm i -g run-func

Kullanım yani çalışma fonksiyonu "init", ihraç edilmelidir, bakın alt

run-func db.js init

veya

Package.json komut dosyasından çalıştır (yerel)

Yüklemek

npm i -S run-func

Kurmak

"scripts": {
   "init": "run-func db.js init"
}

kullanım

npm run init

parametreler

Aşağıdaki bağımsız değişkenler işlev parametresi olarak iletilir init(param1, param2)

run-func db.js init param1 param2

Önemli

işlev (bu örnekte init), onu içeren dosyaya aktarılmalıdır

module.exports = { init };

veya ES6 dışa aktarma

export { init };

Kullanmak için eye_mew 'önerisini kullanmayı düşünüyordum make-runnable, ama bu çok daha iyi, diye düşünüyor. Teşekkürler.
luis.espinal

@ luis.espinal Bunu yararlı bulduğunuz için memnunum. Arka planda daha az sihir var ve dosyaları değiştirmeye gerek yok. Bir işlev dışa aktarılmadığı sürece, olması gerekir, ancak normal ES6 modülleri ve bunların içe / dışa aktarılması gibi mantıklıdır.
Pawel

bu benim için işe yaramıyor; $ run-func db.js init bash: run-func: komut bulunamadı
Patlatus

@Patlatus paketinde bir komut dosyası olmadan doğrudan CLI'den kullanılacak. Global olarak yükleyinnpm i -g run-func
Pawel

@ Patlatus aslında bunun sadece package.json komut dosyalarında çalışmasına izin veren bir hata vardı. Düzelten yeni bir sürüm yükledim ve küresel olarak da çalışıyor
Pawel

9

basit yol:

diyelim ki proje yapısında bir yardımcılar dizininde db.js dosyanız var.

şimdi helpers dizinine gidin ve düğüm konsoluna gidin

 helpers $ node

2) db.js dosyası gerektirir

> var db = require("./db")

3) işlevinizi çağırın (sizin durumunuzda init ())

> db.init()

Bu yardımcı olur umarım


7

Eğer açarsanız db.jsbir modül içine onu gerektirebilir db_init.jsve sadece: node db_init.js.

db.js:

module.exports = {
  method1: function () { ... },
  method2: function () { ... }
}

db_init.js:

var db = require('./db');

db.method1();
db.method2();

7

Bu kirli ama çalışıyor :)

Komutumdan main()fonksiyon çağırıyorum . Daha önce script'in sonuna main çağrıları koydum. Ancak ben diğer bazı işlevler ekledim ve (kodun diğer bazı bölümlerinde işlevleri kullanmak için) komut dosyasından ihraç - ama ben diğer komutları diğer işlevleri almak her zaman main () işlevini yürütmek istemiyorum.

Bu yüzden bunu yaptım, benim betiğimde main () çağrısını kaldırdım ve betiğin sonunda bu denetimi koydum:

if (process.argv.includes('main')) {
   main();
}

CLI'de bu işlevi çağırmak istediğimde: node src/myScript.js main


5

Ben bir IIFE, böyle bir şey yapmak:

(() => init())();

bu kod hemen yürütülür ve init işlevini çağırır.


2
Ancak çalıştırırsanız: node init.jsve dosya bir IIFE içeriyorsa çalışır. Sorunuzu tam olarak anlamadığımı düşünüyorum. Afedersiniz.
Natan Deitch

Tamamen
anlayın

1
İsterseniz bile basitleştirebilirsiniz (init)();:)
Küçük doe

1

Bazen bir işlevi CLI üzerinden çalıştırmak, bazen requirede başka bir modülden çalıştırmak istersiniz . Her ikisini de nasıl yapacağınız aşağıda açıklanmıştır.

// file to run
const runMe = () => {}
if (require.main === module) {
  runMe()
} 
module.exports = runMe

-2

Basit, javascript testfile.js dosyasında:

module.exports.test = function () {
   console.log('hi');
};
this.test();

Bilgi isteminde çalışan:

node testfile.js

4
Elbette, bu bir JS dosyasını çalıştırmanıza izin verir. Orijinal soru, dosyanın akışını değiştirmeden o dosyanın içindeki belirli bir işlevi çağırmaya başlar (örneğin testher seferinde çalıştırılır, bu nedenle dosyayı başka bir işlevi çağırmak için değiştirmeniz gerekir)
Winhowes

-3

Dosyanız yalnızca işlevinizi içeriyorsa, örneğin:

myFile.js:

function myMethod(someVariable) {
    console.log(someVariable)
}

Komut satırından böyle çağırmak hiçbir şey olmayacak:

node myFile.js

Ancak dosyanızı değiştirirseniz:

myFile.js:

myMethod("Hello World");

function myMethod(someVariable) {
    console.log(someVariable)
}

Şimdi bu komut satırından çalışacaktır:

node myFile.js

1
Elbette, bir JS dosyasını nasıl çalıştıracağınız. Soru, işlev değişikliği başına JS dosyası yerine komut satırı girdisinde tek değişikliğin olduğu belirli bir işlevi (birçok olası işlevden) çalıştırıp çalıştıramayacağımı daha fazla amaçladı
winhowes

Bu, kişinin istediği senaryo ile ilgilenmiyor
jobmo

@jobmo, cmd satırından bir yöntem çalıştırmak istiyorlar, bunu yapar. (Ben kendim googling tarafından buraya geldi, bu yüzden başka bir cevap takdir edebilirsiniz), merak etmeyin bir seçim için izin verilen çeşitli cevaplar bir dizi vardır
Blundell

Tam olarak, soru cmd satırından bir yöntem çalıştırmakla ilgilidir. Bu cevapta, myFile.js yürütülür. Hiçbir işlevi yerine getirmez. Daha sonra dosyanın bir işlevi vardır ve işlev dosyanın içinde çağrılır. Demek istediğim bu.
jobmo

Cevabın işlevi komut satırından yürüttüğünü açıkladınız: +1:
Blundell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.