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": "git@github.com:..."
}

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?

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": "git@github.com:...#0.3.1"
}

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

Bagian yang dipotong ( ...) harus diisi:

"myprivatemodule": "git@github.com:{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.


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 git@github.comataugit://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"
}

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.


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


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.


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".


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


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


Semua tautan adalah 404
Cyrille Pontvieux
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.