Düğüm bin betiğini çalıştırırken komut satırı çalışma dizinini belirleyin


121

Bir düğüm komut satırı arayüzü oluşturuyorum. Global olarak kurulur ve yürütmek için bir bin dosyası kullanır.

Üzerinde çalıştığım dosyaların kök dizininde bir komut penceresi açmayı ve ardından sadece komutu çalıştırmayı planlıyorum, ancak process.cwd()düğüm paketinin dizinini döndürürken mevcut çalışma dizinini belirleyemedim . Başlangıçta, kodun bir sarmalayıcı olarak bir toplu iş dosyası kullanılarak yürütüldüğünü varsaydım (bu, başlangıçta bin dosyalarının düğüm olmadan nasıl yürütülebileceğidir) o zaman imkansızdır, ancak kahve betiği bunu başarır. Kahve senaryosu kaynağına bir göz attım ama takip edemedim (yeterince tecrübeli değilim).

Kendiniz test etmek için bu package.json dosyasıyla bir paket oluşturun:

{
  "name": "test-package",
  "version": "1.0.0",
  "bin": {
    "test-package":  "./bin/test-package"
  },
  "main": "/lib/test"
}

kutudaki bu test paketi dosyası:

#!/usr/bin/env node

var path = require('path');
var fs   = require('fs');
var lib  = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');

require(lib + '/test');

Biri buna biraz ışık tutabilir mi?

ve sonra lib / test içindeki komut satırı dizinini deneyin ve alın.

Yanıtlar:


196
  • process.cwd() Eğer uygulama içinde 'process.chdir' tarafından değiştirilmediyse, komutun çalıştırıldığı dizini (düğüm paketinin dizini değil) döndürür.
  • __filename yerleştirildiği dosyanın mutlak yolunu döndürür.
  • __dirnamedizininin mutlak yolunu döndürür __filename.

Dosyaları modül dizininizden yüklemeniz gerekiyorsa, göreli yolları kullanmanız gerekir.

require('../lib/test');

onun yerine

var lib  = path.join(path.dirname(fs.realpathSync(__filename)), '../lib');

require(lib + '/test');

Her zaman çağrıldığı dosyaya bağlıdır ve mevcut çalışma dizinine bağlı değildir.


2
Sonra process.chdir(), orijinali almanın bir yolu var mı?
reergymerej

@reergymerej Muhtemelen chdir () 'i çalıştırmadan önce cwd'yi depolamak isteyeceksiniz (örneğin, var originalCwd = process.cwd();daha sonra komutunuzu çalıştırın process.chdir()ve daha sonra orijinaline dönebilirsiniz).
Döner

olan ../lib/testportatif?
Sebastian

Hayır. Windows ters eğik çizgi kullandığı için taşınabilir bir çözüm değildir. Yani pencerelerde çalıştırmaya çalışırsanız çalışmaz.
zachdyer

1
Aslında NodeJS için bunların hepsi aynı. Windows'ta bile, Unix biçiminde uygun bir şekilde göreli yollara ihtiyaç duyabilirsiniz. Yani ../lib/test, Windows muadili ise taşınabilir ..\lib\testdeğil ...
Christian Ulbrich

48

Mevcut Çalışma Rehberi

Mevcut çalışma dizinini almak için şunları kullanabilirsiniz:

process.cwd()

Ancak, bazı komut dosyalarının, özellikle yutkunmanın, geçerli çalışma dizinini ile değiştireceğini unutmayın process.chdir().

Düğüm Modülü Yolu

Mevcut modülün yolunu şu şekilde alabilirsiniz:

  • __filename
  • __dirname

Orijinal Dizin (komutun başlatıldığı yer)

Komut satırından bir komut dosyası çalıştırıyorsanız ve komut dosyasının şu anda hangi dizinde çalıştığına bakılmaksızın komut dosyasının çalıştırıldığı orijinal dizini istiyorsanız, şunu kullanabilirsiniz:

process.env.INIT_CWD

NPM betikleri ile çalışırken orijinal dizin

Bazen projenin kökü yerine geçerli dizinde bir NPM betiği çalıştırmak istenebilir.

Bu değişken npm paket betiklerinde şu şekilde bulunur:

$INIT_CWD.

NPM'nin yeni bir sürümünü çalıştırıyor olmalısınız. Bu değişken mevcut değilse, NPM'nin güncel olduğundan emin olun.

Bu, package.json dosyanızdaki mevcut yola erişmenizi sağlar, örneğin:

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}

process.env.INIT_CWDdir of döndürürpackage.json
vaughan

2
Dikkat edin, $ INIT_CWD yalnızca Linux'ta çalışır. Windows için% INIT_CWD% kullanmanız gerekecek. Bu sorunun npmjs.com/package/cross-env kullanılarak aşılabileceğini düşünüyorum , ancak ben kendim denemedim
Stephanie

3

Alternatif olarak, mevcut NodeJS betiğinin yalnızca geçerli dizinini elde etmek istiyorsanız, bunun gibi basit bir şey deneyebilirsiniz. Bunun Düğüm CLI'sinde çalışmayacağını unutmayın:

var fs = require('fs'),
    path = require('path');

var dirString = path.dirname(fs.realpathSync(__filename));

// output example: "/Users/jb/workspace/abtest"
console.log('directory to start walking...', dirString);

3

path.resolve('.')aynı zamanda güvenilir ve temiz bir seçenektir, çünkü neredeyse her zaman biziz require('path'). Size çağrıldığı dizinin mutlak yolunu verecektir.


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.