Lebih
Menentukan proyek akar dari berjalan node.js aplikasi
Apakah ada cara yang lebih baik dari proses.cwd()
untuk menentukan direktori root berjalan node.js proses? Sesuatu seperti setara dengan Rel.root
, tapi untuk Node.js. I'm mencari sesuatu yang dapat diprediksi dan dapat diandalkan mungkin.
284
26
Ada beberapa cara untuk pendekatan ini, masing-masing dengan pro dan kontra mereka sendiri:
memerlukan.utama.filename
Dari http://nodejs.org/api/modules.html:
Jadi jika anda ingin direktori dasar untuk aplikasi anda, anda dapat melakukan:
Pro & Kontra
Ini akan bekerja sebagian besar waktu, tetapi jika anda're menjalankan aplikasi anda dengan peluncur seperti 2 atau berjalan moka tes, metode ini akan gagal.
global.X
Node memiliki global namespace objek yang disebut
global
— sesuatu yang anda memasang ke objek ini akan tersedia di mana-mana di aplikasi anda. Jadi, andaindex.js
(atauapp.js
atau apa pun yang anda utama aplikasi file bernama), anda hanya dapat mendefinisikan variabel global:Pro & Kontra
Bekerja secara konsisten tetapi anda harus bergantung pada sebuah variabel global, yang berarti bahwa anda dapat't dengan mudah menggunakan kembali komponen/dll.
proses.cwd()
Ini kembali direktori kerja saat ini. Tidak dapat diandalkan sama sekali, karena itu's sepenuhnya tergantung pada direktori apa proses yang diluncurkan dari:
aplikasi-root-path
Untuk mengatasi masalah ini, saya've dibuat sebuah simpul modul yang disebut aplikasi-root-path. Penggunaan sederhana:
The aplikasi-root-path modul menggunakan beberapa teknik yang berbeda untuk menentukan akar path dari aplikasi, dengan mempertimbangkan secara global modul diinstal (misalnya, jika aplikasi anda berjalan di
/var/www/
tapi modul diinstal di~/.nvm/v0.x.x/lib/node/
). Itu tidak't bekerja 100% dari waktu, tapi itu's akan bekerja di sebagian besar skenario umum.Pro & Kontra
Bekerja tanpa konfigurasi di sebagian besar keadaan. Juga menyediakan beberapa tambahan kemudahan metode (lihat halaman proyek). Con terbesar adalah bahwa hal itu tidak't bekerja jika:
node_modules
direktori (misalnya, jika anda menginstal itu secara global)Anda bisa mendapatkan sekitar ini dengan baik pengaturan
APP_ROOT_PATH
lingkungan variabel, atau dengan menelepon.setPath()
pada modul, tapi dalam kasus itu, anda're mungkin lebih baik menggunakanglobal
metode.NODE_PATH lingkungan variabel
Jika anda'kembali mencari cara untuk menentukan akar path dari aplikasi saat ini, salah satu solusi di atas kemungkinan akan bekerja terbaik bagi anda. Jika, di sisi lain, anda're berusaha untuk memecahkan masalah loading aplikasi modul andal, saya sangat merekomendasikan melihat ke
NODE_PATH
lingkungan variabel.Node's Modul sistem terlihat untuk modul di berbagai lokasi. Salah satu lokasi tersebut adalah di mana pun
proses.env.NODE_PATH
poin. Jika anda mengatur lingkungan ini variabel, maka anda dapatmemerlukan
modul dengan modul standar loader tanpa ada perubahan lain.Misalnya, jika anda menetapkan
NODE_PATH
ke/var/www/lib
, berikut akan bekerja dengan baik:Sebuah cara yang bagus untuk melakukan ini adalah dengan menggunakan
npm
:Sekarang anda dapat memulai aplikasi anda dengan
npm start
dan're emas. Saya menggabungkan ini dengan saya menegakkan node-path modul, yang mencegah sengaja memuat aplikasi tanpaNODE_PATH
set. Untuk kontrol yang lebih menegakkan variabel lingkungan, lihat checkenv.Satu gotcha:
NODE_PATH
harus diatur luar node aplikasi. Anda tidak dapat melakukan sesuatu sepertiproses.env.NODE_PATH = jalan.menyelesaikan(__dirname)
karena modul loader cache daftar direktori itu akan mencari sebelum aplikasi anda berjalan.[ditambahkan 4/6/16] Lain yang benar-benar menjanjikan modul yang mencoba untuk memecahkan masalah ini adalah bergelombang.
__dirname
isn't global; it's lokal untuk saat ini modul sehingga masing-masing file memiliki lokal sendiri, nilai yang berbeda.Jika anda ingin direktori root dari proses yang berjalan, anda mungkin ingin menggunakan
proses.cwd()
.Jika anda ingin prediktabilitas dan keandalan, maka anda mungkin perlu untuk membuat kebutuhan aplikasi anda bahwa beberapa variabel lingkungan yang ditetapkan. Aplikasi anda mencari
MY_APP_HOME
(Atau apapun) dan jika itu's ada, dan aplikasi yang ada di direktori tersebut maka semuanya baik-baik. Jika hal ini tidak terdefinisi atau direktori doesn't berisi aplikasi anda maka harus keluar dengan pesan kesalahan yang meminta pengguna untuk membuat variabel. Itu bisa diatur sebagai bagian dari proses instalasi.Anda dapat membaca variabel lingkungan dalam node dengan sesuatu seperti
proses.env.MY_ENV_VARIABLE
.1 - membuat file dalam root proyek menyebutnya settings.js
2 - di dalam file ini menambahkan kode ini
3 - dalam node_modules membuat modul baru dengan nama “setelan” dan di dalam modul index.js tulis kode ini:
4 - dan setiap saat anda inginkan direktori proyek anda hanya menggunakan
dengan cara ini anda akan memiliki semua proyek relatif terhadap direktori file ini ;)
cara termudah untuk mendapatkan global akar (asumsi anda menggunakan NPM untuk menjalankan node.js aplikasi 'npm mulai', dll)
Jika anda ingin cross-verifikasi atas
Katakanlah anda ingin untuk cross-check
proses.env.PWD
dengan pengaturan anda node.js aplikasi. jika anda ingin beberapa runtime tes untuk memeriksa validitas dariproses.env.PWD
, anda bisa cross-check dengan kode ini (yang saya tulis yang tampaknya bekerja dengan baik). Anda bisa cross-check nama folder terakhir di appRoot dengan npm_package_name dalam paket anda.json file, misalnya:anda juga dapat menggunakan NPM modul:
memerlukan('aplikasi-root-path')
yang berfungsi sangat baik untuk tujuan iniI've ditemukan ini bekerja secara konsisten untuk saya, bahkan ketika aplikasi dijalankan dari sub-folder, karena dapat dengan menguji beberapa kerangka, seperti Mocha:
Mengapa ini bekerja:
Pada saat runtime node menciptakan registry dari jalan penuh dari semua file yang dimuat. Modul-modul yang dimuat pertama, dan dengan demikian di atas registri ini. Dengan memilih elemen pertama dari registri dan kembali jalan sebelum 'node_modules' direktori kita dapat menentukan akar dari aplikasi.
It's hanya satu baris kode, tapi untuk kesederhanaan's sake (ku), aku hitam kemas menjadi sebuah NPM modul:
https://www.npmjs.com/package/node-root.pddivine
Nikmati!
Mungkin anda dapat mencoba melintasi ke atas dari
__filename
sampai anda menemukanpaket.json
, dan memutuskan bahwa's direktori utama anda saat ini berkas milik.Semua ini "akar dirs" sebagian besar perlu untuk menyelesaikan beberapa virtual path ke real tumpukan jalan, jadi mungkin anda harus melihat
path.mengatasi
?Sebenarnya, saya menemukan mungkin sepele solusi juga untuk yang paling kuat: anda cukup letakkan file berikut pada direktori root dari proyek anda: root-path.js yang memiliki kode berikut:
Sesederhana tambahkan baris ini untuk anda modul di root, biasanya itu adalah app.js
Kemudian _basedir akan accessiable untuk semua modul.
Teknik yang saya've ditemukan berguna ketika menggunakan express adalah dengan menambahkan kode berikut ke app.js sebelum anda lainnya rute yang ditetapkan
Tidak perlu menggunakan globals dan anda memiliki jalur dari direktori root sebagai properti dari objek permintaan.
Ini bekerja jika anda app.js adalah akar dari proyek anda yang, secara default, itu adalah.
Aku tahu ini sudah terlambat. Tapi kita dapat mengambil akar URL dengan dua metode
Metode 1
Metode 2
Link referensi:- https://gist.github.com/geekiam/e2e3e0325abd9023d3a3
Membuatnya seksi 💃🏻.
Tiga langkah sederhana untuk memecahkan masalah jelek jalan.
npm install seksi-memerlukan-simpan
memerlukan('seksi-memerlukan')
sekali pada bagian atas anda utama aplikasi file.memerlukan('seksi-memerlukan'); const router = require('/router'); const api = require('$api'); ...
.jalur
file pada root direktori proyek anda.$db = /server/database $api-v1 = /server/api/legacy $api-v2 = /server/api/v2
Di atas file utama menambahkan:
Kemudian menggunakannya dalam setiap file yang anda butuhkan:
mainDir
didefinisikan secara global, jika yang anda butuhkan hanya di saat ini file - gunakan__dirname
sebagai gantinya.main.js
,index.js
,gulpfile.js
.Saya menggunakan ini.
Untuk modul yang bernama
mymodule
var BASE_DIR = __dirname.replace(/^(.*\/mymodule)(.*)$/, '$1')
Tambahkan ini di suatu tempat menuju awal utama anda file aplikasi (mis. app.js):
Ini menetapkan sebuah variabel global yang akan selalu menjadi setara dengan aplikasi anda's base dir. Gunakan hanya seperti yang lain variabel:
Sederhana...
Ada
INIT_CWD
propertiproses.env
. Ini adalah apa yang saya'm saat ini bekerja di proyek saya.Good Luck...
Anda hanya dapat menambahkan direktori root path di aplikasi express variabel dan mendapatkan jalan ini dari app. Untuk ini, tambahkan
app.set('direktori', __dirname);
pada anda index.js atau app.js file. Dan menggunakanreq.aplikasi.mendapatkan('direktori')
untuk mendapatkan root directory path di kode anda.jika anda ingin menentukan proyek akar dari berjalan node.js aplikasi anda hanya dapat terlalu.
proses.mainModule.jalan
Ini akan melakukan:
Mendapatkan semua jalan di modul utama dan menyaring orang-orang dengan "node_modules", kemudian mendapatkan pertama dari jalan yang tersisa klik disini. Perilaku tak terduga tidak akan melemparkan kesalahan, hanya sebuah
undefined
.Bekerja dengan baik untuk saya, bahkan ketika menelepon ie
$ mocha
.