Nvm-windows: Mendukung .nvmrc

Dibuat pada 8 Jan 2016  ·  18Komentar  ·  Sumber: coreybutler/nvm-windows

Memungkinkan proyek untuk menentukan versi yang akan digunakan.
Lihat penggunaan nvm

atau mungkin versi lemari parse yang tersedia dari mesin package.json

enhancement request wontfix

Komentar yang paling membantu

Dukungan .nvmrc adalah aspek yang cukup penting dalam menggunakan NVM dengan sistem CI. Saya tidak menautkan saran package.json, terutama karena merusak kompatibilitas dengan nvm, tetapi apakah permintaan tarik dengan dukungan untuk .nvmrc akan diterima?

Semua 18 komentar

Saya tidak berpikir ini adalah rute yang ingin saya lewati. Alasan utamanya adalah akan memerlukan beberapa peretasan yang sangat buruk untuk membuat ulang/meniru biner simpul. Misalnya, memanggil node index.js sarana yang hack / dipalsukan node.exe perlu parse pertama package.json File (jika bahkan ada) untuk menentukan versi dan kemudian jalankan nyata node.exe untuk versi yang sesuai.

Beberapa proyek serupa lainnya telah mencoba menggunakan file .bat untuk mencapai ini. Pendekatan ini rapuh, dan bertentangan dengan tujuan utama arsitektur .

Saya juga hanya tidak berpikir permintaan tersebar luas untuk ini.

Dukungan .nvmrc adalah aspek yang cukup penting dalam menggunakan NVM dengan sistem CI. Saya tidak menautkan saran package.json, terutama karena merusak kompatibilitas dengan nvm, tetapi apakah permintaan tarik dengan dukungan untuk .nvmrc akan diterima?

@ gruber76 - Saya mungkin tidak akan menerima PR untuk ini.

.nvmrc , package.json ... keduanya membutuhkan peretasan jahat yang sama.

@coreybutler Saya tidak yakin saya mengerti alasan Anda karena tidak ingin mendukung ini. Bukankah memiliki fitur ini hanya mundur untuk melihat ke dalam file .nvmrc setiap kali nvm dipanggil tanpa menentukan nomor versi? Oleh karena itu, peretasan jahat apa yang Anda bicarakan?

Peretasan jahat: tulis ulang symlink untuk Windows.

NVM untuk Windows bekerja dengan mengubah target symlink ke direktori instalasi node fisik yang diinginkan. Ini adalah perubahan di seluruh sistem.

Katakanlah Anda menjalankan skrip dengan menentukan versi 0.12.0 dalam file .nvmrc , lalu jalankan skrip kedua tanpa .nvmrc . symlink akan menunjuk ke v0.12.0 (dari instantiasi pertama). Jika skrip ke-2 memerlukan sesuatu yang lain (seperti v4.2.6) tanpa .nvmrc , itu akan gagal. Ini menimbulkan ketidakstabilan lingkungan saat menggunakan symlink karena tidak ada isolasi proses yang sebenarnya.

Satu-satunya cara untuk benar-benar mengisolasi versi pada basis per-proses adalah dengan mengarahkan nvm.exe ke versi yang diminta skrip alih-alih mengizinkan sistem operasi melakukannya. Saya benar-benar tidak ingin membuat ulang sesuatu yang sudah dilakukan sistem operasi untuk kita.

Jika orang benar-benar ingin menggunakan pendekatan per proses/proyek, solusi yang lebih tepat adalah mengisolasi lingkungan runtime. Secara pribadi, saya menggunakan Docker untuk itu.

Maafkan saya atas ketidaktahuan saya, di sini. Kasus penggunaan utama saya adalah mengembangkan aplikasi node/web menggunakan bower/grunt/gulp, dll. dengan banyak tim. Bagi saya, sangat jarang saya menjalankan beberapa versi dalam waktu lima menit satu sama lain. Untuk kasus penggunaan ini, file .nvmrc adalah cara tim saya menentukan node apa yang harus dilakukan.

Saya mengalami kesulitan melihat dalam situasi yang Anda gambarkan (skrip A versus skrip B) bagaimana mendukung .nvmrc akan lebih merepotkan daripada memiliki skrip A (atau pengguna skrip A) memanggil nvm untuk mengatur versi dan kemudian lupa untuk mengatur itu sebelum menjalankan skrip B. Tapi saya kira ada beberapa kasus penggunaan umum untuk nvm yang inti jauh lebih sulit daripada milik saya. Mungkin, misalnya, jika server CI saya memiliki beban yang lebih berat.

Saya memiliki solusi hackey untuk ditawarkan kepada orang lain yang membutuhkannya. Berikut ini dalam skrip kelelawar pra-jalankan:

set /p nodev=<.nvmrc
nvm install %nodev%
nvm use %nodev%

Mengapa tidak meletakkan perintah nvm untuk mengatur versi yang diperlukan dalam skrip npm?

Steve Lee
Dikirim dari perangkat seluler saya Mohon maafkan kesalahan pengetikan
Pada 3 Mar 2016 16:50, "gruber76" [email protected] menulis:

Maafkan saya atas ketidaktahuan saya, di sini. Kasus penggunaan utama saya sedang berkembang
node/aplikasi web menggunakan bower/grunt/gulp, dll. dengan banyak tim. Untuk
saya, sangat jarang saya memiliki banyak versi yang berjalan di dalamnya
lima menit satu sama lain. Untuk kasus penggunaan ini, file .nvmrc adalah bagaimana saya
tim menentukan node apa yang harus dilakukan.

Saya mengalami kesulitan melihat dalam situasi yang Anda gambarkan (skrip A versus
skrip B) bagaimana mendukung .nvmrc akan lebih merepotkan daripada memiliki
skrip A (atau pengguna skrip A) memanggil nvm untuk mengatur versi dan kemudian
lupa mengaturnya sebelum menjalankan skrip B. Tapi saya kira ada
beberapa kasus penggunaan umum untuk nvm yang merupakan inti yang jauh lebih sulit daripada milik saya.
Mungkin, misalnya, jika server CI saya memiliki beban yang lebih berat.

Saya memiliki solusi hackey untuk ditawarkan kepada orang lain yang membutuhkannya. NS
berikut dalam skrip kelelawar pra-jalankan:

set /p nodev=<.nvmrc
nvm pasang %nodev%
nvm gunakan %nodev%


Balas email ini secara langsung atau lihat di GitHub
https://github.com/coreybutler/nvm-windows/issues/128#issuecomment -191852401
.

Mendukung file .nvmrc akan sangat membantu. Kami memiliki banyak proyek, dan tidak semuanya menjalankan versi node yang sama. File .nvmrc berada di root setiap repo untuk memastikan bahwa versi node yang benar digunakan untuk proyek tertentu.

Sebagai catatan tambahan, agak mengganggu juga bahwa nvm install harus diikuti oleh nvm use . Saya ingin tahu alasan di balik membutuhkan langkah kedua setelah instalasi. Saya dapat melihat bagaimana menginstal dan menggunakan adalah hal yang berbeda, tetapi saya ingin tahu apakah pernah ada kasus penggunaan di mana seseorang akan mengunduh dan menginstal, tetapi tidak menggunakannya.

Solusi kami untuk ini adalah kami memiliki file bernama install-node.js yang berada di root setiap proyek. Setiap kali kita beralih ke sebuah proyek, kita menjalankan node install-node dari baris perintah. Isi dari file install-node.js adalah sebagai berikut:

var childProcess = require('child_process')
var fs = require('fs')

var nodeVersion = fs.readFileSync('.nvmrc', 'utf8').trim()

var command = "nvm install " + nodeVersion + " && nvm use " + nodeVersion
console.log('executing command: ' + command)
childProcess.exec(command, function(error, stdout, stderr) {
  if (stdout) console.log(stdout.toString())
  if (stderr) console.error(stderr.toString())
  if (error) console.error(error)
})

@josh-egan-ps - Pemisahan antara install dan use sebagian besar untuk konfigurasi lingkungan massal. Saya akan sering menginstal beberapa versi node sebelum membalik di antara mereka. Namun; tampaknya sangat masuk akal untuk memiliki tanda, seperti nvm install -u 5.9.1 untuk menginstal dan secara otomatis menggunakan... atau secara otomatis menggunakan versi dan memiliki tanda untuk _tidak_ menggunakannya. Saya pasti akan mempertimbangkan untuk menambahkan ini.

Untuk semua orang - Jika Anda benar-benar perlu beralih pada basis per proyek, pertimbangkan untuk meletakkan nvm use x.x.x && node index.js di bagian skrip npm start dari package.json Anda. Praktik terbaik yang umum adalah selalu menggunakan npm start untuk meluncurkan aplikasi simpul.

Untuk semua orang - Jika Anda benar-benar perlu beralih pada basis per proyek, pertimbangkan untuk menempatkan nvm use xxx && node index.js di bagian skrip npm start dari package.json Anda. Praktik terbaik yang umum adalah selalu menggunakan npm start untuk meluncurkan aplikasi node.

Itu mungkin sebenarnya sudah terlambat jika skrip npm _build_ digunakan selama instalasi yang bergantung pada versi node/npm. Atau alat lain seperti grunt dll berjalan dengan cepat Mereka bisa gagal saat menginstal dengan versi node / npm yang salah. atau menggunakan versi yang salah yang menyebabkan masalah lain, BTW saya berasumsi praktik terbaik lainnya dengan menginstal _semuanya_ secara lokal (yaitu bukan -g) sehingga dependensi versi tidak pernah menjadi masalah.

Jadi, ini adalah praktik yang baik untuk menggunakan npm install untuk mengatur semuanya. Anda kemudian dapat menambahkan langkah pra-instal untuk menggunakan penggunaan nvm. misalnya tambahkan

    "preinstall": "nvm use x.x.x",

Itu akan baik-baik saja bahkan jika versi npm asli akan berjalan dalam proses induk. Langkah install akan meluncurkan shell baru sehingga semua tindakan harus mengambil node baru dan npm.

Anda bahkan mungkin ingin menambahkan langkah pra mulai daripada menginstal.

@SteveALee - ya, Anda benar, saran saya sebelumnya tidak akan berhasil. Akan terlambat dalam proses untuk meluncurkan dengan andal.

@coreybutler Pada akhirnya saya memilih ini

"preinstall":"nvm use 4.4.1 || echo nvm not found: check node version && pause",

Mungkin opsi nvm use -i x.x.x akan bagus? Artinya, instal jika belum ada?

Saya ingin menyarankan untuk mengimplementasikan bagian dari ini setidaknya:

Di Linux / Mac, dalam folder dengan file .nvmrc , saya dapat menjalankan nvm use tanpa menentukan versi konkret, dan versi terinstal yang cocok dengan konten .nvmrc mendapat diaktifkan. Jika file tersebut mengatakan 8 , maka versi terbaru dari Node 8 akan diinstal.

Saya menggabungkan ini di sistem saya dengan skrip yang membebani cd sehingga saya dapat cd ke dalam direktori dan versi simpul yang tepat diaktifkan, dengan skrip ini di .bashrc :

# Support .nvmrc
load-nvmrc() {
  if [[ -f .nvmrc && -r .nvmrc ]]; then
    nvm use
  elif [[ $(nvm version) != $(nvm version default)  ]]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
# Override `cd` to auto-load correct version of Node on enterting directory.
cd() { builtin cd "$@"; 'load-nvmrc'; }

Ini dapat dengan mudah bekerja pada Windows juga, jika nvm menghormati file-file ini.

.nvmrc tidak akan diimplementasikan secara default. Namun; peta jalan memiliki rencana untuk dukungan kait (https://github.com/coreybutler/nvm-windows/issues/190). Skrip pre-use dapat digunakan untuk menyesuaikan versi sesuai dengan file apa pun yang mereka inginkan (termasuk package.json, .nvmrc, atau apa pun yang Anda pilih).

Karena masalah ini tampaknya hampir mati, saya punya skrip Powershell solusi yang harus meniru fungsi "nvm use" dan "nvm install" jika file .nvmrc berisi versi node satu digit.

nvm install (Get-Content .nvmrc) akan berfungsi dengan baik namun nvm use (Get-Content .nvmrc) tidak akan berfungsi (karena ketika versi satu digit dilewatkan untuk menginstal, itu menginstal revisi terbaru dari versi simpul itu tetapi nvm use dengan satu digit menambahkan '.0.0' ke dalamnya alih-alih mendapatkan yang terbaru.

@coreybutler Jika Anda memperbarui perintah "gunakan" di nvm.go untuk menggunakan kode yang sama dengan install , itu akan membuat perbaikan ini tidak perlu (yaitu):
if len(version) == 1 { version = findLatestSubVersion(version) } else { version = cleanVersion(version) }

Skrip berikut akan menggunakan "nvm list available" dan memfilter daftar untuk versi LTS tertinggi yang cocok dengan versi file .nvmrc dan kemudian 'nvm use'. Jika tidak diinstal, 'nvm install' itu lalu 'nvm use'.
((nvm use (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc)) + '.*'})[0].split('|')[2].trim()) -like '*not installed*') -and (nvm install (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc) + '.*') })[0].split('|')[2]) -and (nvm use (nvm list available | Where-Object -FilterScript { $_ -like ('* ' + (Get-Content .nvmrc) + '.*') })[0].split('|')[2].trim())

Hanya ingin meminta dukungan penggunaan nvm untuk membaca dari file .nvmrc. Itu benar-benar akan membuat pengalaman pengembangan simpul saya antara Mac dan Windows menjadi mulus.

Apakah ini ditutup karena sudah diperbaiki atau tidak akan diubah?

Apakah ada versi lain yang kompatibel dengan Windows dari nvm yang menggunakan API yang sama dengan versi *nix?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat