npm instal dari Git dalam versi tertentu

181

Diasumsikan bahwa saya telah menulis modul untuk Node.js yang ingin saya rahasiakan. Saya tahu bahwa saya dapat (harus) menambahkan baris:

"private": "true"

ke package.jsonfile, dan saya juga tahu bahwa saya bisa npm installmodul ini menggunakan jalur sistem file atau tautan ke repositori git, termasuk GitHub.

Saya juga tahu bahwa saya dapat meletakkan jalur sistem file atau tautan ke git repo ke dalam package.json, sehingga dependenciesbagian tersebut terlihat seperti ini:

"dependencies": {
  "myprivatemodule": "[email protected]:..."
}

Yang saya inginkan sekarang bukan untuk menautkan ke versi terbaru, tetapi ke yang spesifik. Satu-satunya kemungkinan yang saya ketahui adalah menautkan ke komit tertentu menggunakan ID-nya. Tapi ini jauh lebih mudah dibaca dan lebih buruk dikelola daripada menggunakan nomor versi seperti 0.3.1.

Jadi pertanyaan saya adalah: Apakah mungkin untuk menentukan nomor versi seperti itu dan membuat npm mencari repositori git untuk komit terbaru yang mencakup versi ini?

Jika tidak, bagaimana Anda mengatasi masalah ini di proyek Anda? Apakah Anda hidup dengan ID komit atau ada solusi yang lebih baik untuk ini?

Golo Roden
sumber

Jawaban:

193

Sebuah ketergantungan harus tersedia dari registryyang akan diinstal hanya dengan menentukan versiondeskriptor .

Anda tentu dapat membuat dan menggunakan registri Anda sendiri alih-alih registry.npmjs.orgjika proyek Anda tidak boleh dibagikan secara publik.

Tetapi, jika tidak ada dalam registri, itu harus dirujuk oleh URL atau URL Git . Untuk menentukan versi dengan URL Git, sertakan yang sesuai <commit-ish>, seperti tag, di bagian akhir sebagai fragmen URL .

Contoh, untuk tag bernama 0.3.1:

"dependencies": {
  "myprivatemodule": "[email protected]:...#0.3.1"
}

Catatan : Cuplikan di atas menunjukkan URL dasar sama dengan yang diposting di pertanyaan.

Bagian yang dipotong ( ...) harus diisi:

"myprivatemodule": "[email protected]:{owner}/{project}.git#0.3.1"

Dan, format alamat yang berbeda akan diperlukan ketika akses SSH tidak tersedia:

"myprivatemodule": "git://github.com/{owner}/{project}.git#0.3.1"

Tergantung pada OS Anda, Anda mungkin juga dapat linkketergantungan pada folder lain tempat Anda mengkloning dari Github.

Jonathan Lonowski
sumber
1
Tampaknya beberapa tautan dalam pos ini sudah usang, karena mengarah ke 404 halaman. Sangat disayangkan, karena beberapa di antaranya adalah informasi yang sudah lama saya cari.
MvG
5
Saya menandai versi tertentu dengan git tag -a "1.0.0"dan mendorong git push --tags, lalu saya menambahkan #v1.0.0di akhir git+sshketergantungan. Tapi npm updatetidak ada yang terjadi.
loretoparisi
3
@loretoparisi Maaf. Saya tidak bermaksud menyarankan bahwa menambahkan vitu perlu. Setelah itu #, fragmen harus cocok dengan nama lengkap tag (atau komitmen lainnya ) - dalam kasus Anda #1.0.0,.
Jonathan Lonowski
Pada Juli 2016, hosting registri sendiri menjadi lebih rumit karena mereka pindah dari couchdb ke layanan microser
Yan Foto
3
Anda sekarang dapat melakukan npm i {owner}/{project}#{tag}atau menambahkan "{library}": "github:{owner}/{project}#{tag}"ke package.json daripada menggunakan [email protected]ataugit://github.com
Mike W
238

Jawaban yang diterima tidak berhasil untuk saya. Inilah yang saya lakukan untuk menarik paket dari github:

npm install --save "git://github.com/username/package.git#commit"

Atau menambahkannya secara manual di package.json:

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}
surjikal
sumber
41
Jika Anda menggunakan http / https, pastikan Anda menyertakan awalan "git +":"package": "git+https://github.com/username/package.git#commit"
Ates Goral
4
Ini berfungsi sejauh "npm install" tetapi ketika saya mencoba untuk menjalankan aplikasi saya yang membutuhkan ('mymodule') gagal menemukan paket itu. Meskipun paket berada di direktori node_modules dengan nama yang sama.
Derrick
Oh, modul yang dimaksud tidak menyertakan build dengan komit spesifik yang saya inginkan jadi jika Anda memiliki masalah yang sama, Anda mungkin harus membangunnya secara manual.
Derrick
1
Anda juga dapat menggunakan #tagyang biasanya menunjuk pada nomor versi
deltree
1
@surjikal Anda perlu menandai rilis sebelum Anda dapat menggunakan nomor versi dengan git. misalnya git tag -a v1.0.1 && git push --tag && git pushseperti @Jonathan Lonowski juga katakan dalam komentar.
dotnetCarpenter
80

Jika menurut versi Anda maksud suatu tag atau rilis, maka github menyediakan tautan unduhan untuk itu. Misalnya, jika saya ingin menginstal fetch versi 0.3.2 (ini tidak tersedia pada npm), maka saya tambahkan di package.jsonbawah dependencies:

"fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz",

Satu-satunya kelemahan jika dibandingkan dengan pendekatan hash komit adalah bahwa hash dijamin tidak mewakili kode yang diubah, sedangkan tag dapat diganti. Syukurlah ini jarang terjadi.

Memperbarui:

Saat ini pendekatan yang saya gunakan adalah notasi ringkas untuk ketergantungan yang dilayani GitHub:

"dependencies": {
  "package": "github:username/package#commit"
}

Di mana komit dapat berupa komit, seperti tag. Dalam kasus GitHub Anda bahkan dapat menjatuhkan inisial github:karena ini adalah default.

qubyte
sumber
Mode arsip juga berfungsi untuk komit; mis., `yarn add github.com
github
Solusi terbersih.
Charley Bodkin
8

Contoh komentar saya untuk @qubyte di atas dicincang, jadi inilah sesuatu yang lebih mudah dibaca ...

Metode @surjikal yang dijelaskan di atas berfungsi untuk komit cabang, tetapi tidak berfungsi untuk komit pohon yang saya coba sertakan.


Mode arsip juga berfungsi untuk komit. Misalnya, ambil @ a2fbf83

npm :

npm install  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

benang :

yarn add  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

format :

 https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz


Inilah pohon komit yang memerlukan /archive/mode:

yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

untuk komit vuex terkait

bvj
sumber
8

Perintah ini menginstal paket npm username/packagedari komit git tertentu:

npm install https://github.com/username/package#3d0a21cc

Inilah 3d0a21cc8 karakter pertama dari hash komit.

Prisacari Dmitrii
sumber
3

Saya jelaskan di sini masalah yang saya hadapi ketika dijalankan npm install- paket tidak muncul di node_modules.

Masalahnya adalah bahwa namenilai dalam package.jsonpaket yang diinstal berbeda dari nama paket yang diimpor (kunci package.jsondari proyek saya).

Jadi, jika nama proyek diinstal Anda some-package(nilai nama di nya package.json) maka dalam package.jsonmenulis proyek Anda: "some-package": "owner/some-repo#tag".

andrew
sumber
Saya berharap saya menemukan jawaban Anda sebelumnya 😓 - Saya baru saja menyelesaikan, dengan masalah yang sama membuat saya berjuang untuk sementara waktu; dan namepersyaratan ini tidak sering disebutkan di internet .. (bukan berarti saya bisa menanggungnya, setidaknya).
Kamafeather
"Tambahkan dependensi paket Anda ke package.json Anda menentukan nama paket dengan cakupan penuh." - Tidak terlalu menekankan: help.github.com/en/articles/…
Kamafeather
Saya menemukan bahwa itu npm install --save git+https://<remote-github-repo-url>adalah cara yang cukup aman untuk tidak terkena masalah ini lagi di masa depan.
Kamafeather
2

Saya perlu menjalankan dua versi tfjs-core dan menemukan bahwa keduanya perlu dibangun setelah diinstal.

package.json:

"dependencies": {
  "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
  "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"
}

Kemudian:

cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../

Dan akhirnya, untuk menggunakan perpustakaan:

import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
import * as tf110 from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';

Ini bekerja dengan baik tetapi tentu saja #hoodrat

duhaime
sumber
1
Terima kasih, saya telah mencoba mengimpornya dengan cara lain yang bisa dibayangkan. Saya harus melihat cuplikan Anda untuk menyadari bahwa saya harus mengimpor langsung dari file.
Victor Ivens
1

Jika Anda melakukan ini dengan lebih dari satu modul dan ingin memiliki lebih banyak kontrol atas versi, Anda harus melihat memiliki registri npm pribadi Anda sendiri.

Dengan cara ini Anda dapat npm menerbitkan modul Anda ke registri npm pribadi Anda dan menggunakan entri package.json dengan cara yang sama seperti yang Anda lakukan untuk modul publik.

https://docs.npmjs.com/files/package.json#dependencies

Igor Soarez
sumber
Semua tautan adalah 404
Cyrille Pontvieux