Tentukan direktori kerja baris perintah saat menjalankan skrip node bin

120

Saya membuat antarmuka baris perintah node. Ini diinstal secara global dan menggunakan file bin untuk dieksekusi.

Saya berencana untuk membuka jendela perintah di direktori root dari file yang sedang saya kerjakan dan kemudian jalankan saja perintah tersebut namun saya tidak dapat menentukan direktori kerja saat process.cwd()ini karena mengembalikan direktori paket node. Saya awalnya berasumsi bahwa karena kode sedang dieksekusi menggunakan file batch sebagai pembungkus (begitulah file bin dapat dieksekusi tanpa node di awal) maka itu tidak mungkin tetapi skrip kopi berhasil melakukannya. Saya melihat sumber skrip kopi tetapi tidak dapat mengikutinya (tidak cukup berpengalaman).

Untuk mengujinya sendiri, buat paket dengan file package.json ini:

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

file paket uji ini di bin:

#!/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');

Adakah yang bisa menjelaskan hal ini.

dan kemudian mencoba dan mendapatkan direktori baris perintah di dalam lib / test.

Daniel Chatfield
sumber

Jawaban:

196
  • process.cwd() mengembalikan direktori di mana perintah telah dijalankan (bukan direktori paket node) jika belum diubah oleh 'process.chdir' di dalam aplikasi.
  • __filename mengembalikan jalur absolut ke file tempatnya ditempatkan.
  • __dirnamemengembalikan jalur absolut ke direktori __filename.

Jika Anda perlu memuat file dari direktori modul Anda, Anda perlu menggunakan jalur relatif.

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

dari pada

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

require(lib + '/test');

Itu selalu relatif terhadap file tempat dipanggilnya dan tidak bergantung pada direktori pekerjaan saat ini.

Vadim Baryshev
sumber
2
Setelah itu process.chdir(), apakah ada cara untuk mendapatkan aslinya?
reergymerej
@reergymerej Anda mungkin ingin menyimpan cwd terlebih dahulu sebelum menjalankan chdir () (misalnya, var originalCwd = process.cwd();kemudian jalankan milik Anda process.chdir(), dan Anda dapat kembali ke aslinya setelah itu).
Putar
adalah ../lib/testportable?
Sebastian
Tidak. Ini bukan solusi portabel karena jendela menggunakan garis miring terbalik. Jadi jika Anda mencoba menjalankannya di windows itu tidak akan berhasil.
zachdyer
1
Sebenarnya untuk NodeJS semuanya sama saja. Bahkan di Windows Anda dapat dengan mudah meminta jalur relatif dengan cara Unix. Jadi ../lib/testportabel, sedangkan mitra Windows ..\lib\testtidak ...
Christian Ulbrich
48

Direktori Kerja Saat Ini

Untuk mendapatkan direktori kerja saat ini, Anda dapat menggunakan:

process.cwd()

Namun, ketahuilah bahwa beberapa skrip, terutama gulp, akan mengubah direktori kerja saat ini dengan process.chdir().

Jalur Modul Node

Anda bisa mendapatkan jalur modul saat ini dengan:

  • __filename
  • __dirname

Direktori Asli (tempat perintah dimulai)

Jika Anda menjalankan skrip dari baris perintah, dan Anda menginginkan direktori asli tempat skrip dijalankan, terlepas dari direktori mana skrip tersebut saat ini beroperasi, Anda dapat menggunakan:

process.env.INIT_CWD

Direktori asli, saat bekerja dengan skrip NPM

Terkadang diinginkan untuk menjalankan skrip NPM di direktori saat ini, daripada di root proyek.

Variabel ini tersedia di dalam skrip paket npm sebagai:

$INIT_CWD.

Anda harus menjalankan NPM versi terbaru. Jika variabel ini tidak tersedia, pastikan NPM adalah yang terbaru.

Ini akan memungkinkan Anda mengakses jalur saat ini di package.json Anda, misalnya:

scripts: {
  "customScript": "gulp customScript --path $INIT_CWD"
}
superluminer
sumber
process.env.INIT_CWDmengembalikan direktoripackage.json
vaughan
2
Awas, $ INIT_CWD hanya bekerja di Linux. Untuk Windows, Anda harus menggunakan% INIT_CWD%. Saya pikir masalah ini dapat diatasi dengan menggunakan npmjs.com/package/cross-env , tetapi saya belum mencobanya sendiri
Stephanie
3

Sebagai alternatif, jika Anda hanya ingin mendapatkan direktori saat ini dari skrip NodeJS saat ini, Anda dapat mencoba sesuatu yang sederhana seperti ini. Perhatikan bahwa ini tidak akan berfungsi di Node CLI itu sendiri:

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);
John Paul Barbagallo
sumber
3

path.resolve('.')juga merupakan pilihan yang andal dan bersih, karena kami hampir selalu require('path'). Ini akan memberi Anda jalur absolut dari direktori tempat ia dipanggil.

sziraqui.dll
sumber
0

Inilah yang berhasil untuk saya:

console.log(process.mainModule.filename);
Etienne Martin
sumber