Instal modul npm dari gitlab private repository

98

Kami menggunakan GitLab untuk proyek pribadi kami. Ada beberapa pustaka bercabang dari github, yang ingin kami instal sebagai modul npm. Menginstal modul itu langsung dari npm tidak apa-apa dan sebagai contoh ini:

npm install git://github.com/FredyC/grunt-stylus-sprite.git

... berfungsi dengan benar juga, tetapi melakukan hal yang sama untuk GitLab, hanya mengubah domain membuat saya mengalami kesalahan ini.

npm WARN `git config --get remote.origin.url` returned wrong result (git://git.domain.com/library/grunt-stylus-sprite.git)
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git Cloning into bare repository 'D:\users\Fredy\AppData\Roaming\npm-cache\_git-remotes\git-git-domain-com-library-grunt-stylus-sprite-git-6f33bc59'...
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git fatal:unable to connect to git.domain.com:
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git git.domain.com[0: 77.93.195.214]: errno=No error
npm ERR! Error: Command failed: Cloning into bare repository 'D:\users\Fredy\App
Data\Roaming\npm-cache\_git-remotes\git-git-domain-com-library-grunt-stylus-spr
ite-git-6f33bc59'...
npm ERR! fatal: unable to connect to git.domain.com:
npm ERR! git.domain.com[0: xx.xx.xx.xx]: errno=No error

Dari antarmuka web GitLab, saya memiliki URL ini [email protected]:library/grunt-stylus-sprite.git. Menjalankan ini untuk npm installmencoba menginstal gitmodul dari registri npm.

Namun menggunakan URL: [email protected]:library/grunt-stylus-sprite.gittiba-tiba meminta saya untuk memasukkan kata sandi. Kunci SSH saya tidak menyertakan frasa sandi, jadi saya anggap kunci itu tidak dapat dimuat. Mungkin ada beberapa konfigurasi yang saya lewatkan? Kunci terletak di lokasi standar di direktori home saya dengan nama "id_rsa".

Saya menggunakan Windows 7 x64.

MEMPERBARUI

Sejak NPM v3 ada dukungan bawaan untuk GitLab dan sumber lain (BitBucket, Gist), dari mana Anda dapat menginstal paket. Sayangnya ini hanya berfungsi untuk yang publik jadi tidak sepenuhnya terkait dengan ini, tetapi beberapa mungkin merasa berguna.

npm install gitlab:<gitlabname>/<gitlabrepo>[#<commit-ish>]

Lihat dokumentasi: https://docs.npmjs.com/cli/install

FredyC
sumber
1
jadi apa url gitlab sebenarnya yang saya gunakan? Saya hanya melihat <placeholders>saya mencoba beberapa variasi dan masih mengatakan proyek tidak ditemukan.
chovy
1
$ npm i -S git+ssh://[email protected]/org/repo.gittidak bekerja
chovy

Jawaban:

157

Anda memiliki metode berikut untuk menghubungkan ke repositori gitlab pribadi

Dengan SSH

git+ssh://[email protected]:Username/Repository#{branch|tag}
git+ssh://[email protected]/Username/Repository#{branch|tag}

Dengan HTTPS

git+https://[email protected]/Username/Repository#{branch|tag}

Dengan HTTPS dan terapkan token

git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}
sidhuko
sumber
Ya, cukup banyak yang saya pikirkan. Anda bahkan dapat menentukan cabang atau tag seperti Repository#1.2.3. Saya akan mengubah centang jawaban karena ini lebih akurat.
FredyC
1
@jamessidhu Saya tidak yakin tetapi meminta saya kata sandi bahkan dengan SSH. Setelah memberikan kata sandi itu memberi saya kesalahan. Ada ide bagaimana mengatasinya?
Codesnooker
@codesnooker Sudahkah Anda menyiapkan kunci SSH di Gitlab ? Jika kunci tidak diotorisasi antara mesin Anda dan remote itu akan default ke kata sandi seperti akses ke server.
sidhuko
5
Ini sebenarnya hanya berfungsi untuk saya dengan sintaks URL yang benar, misalnya git+ssh://[email protected]/Username/Repository(perhatikan / pisahkan host dan nama pengguna). Ini mungkin hal khusus benang, mungkin contoh yang disarankan berfungsi dengan npm
Ivo van der Wijk
1
token penerapan berfungsi dengan baik. <token-name>dalam contoh terlihat gitlab+deploy-token-17034, ini bukan nama arbitrer yang Anda tetapkan ke token.
Mr5o1
26

Alih-alih git://, gunakan git+ssh://dan npm harus melakukan hal yang benar.

isaacs
sumber
5
Jawaban dari npm creator sendiri 👆
Dima Parzhitsky
Saya mendapatkanundefined ls-remote <url>
chovy
git + ssh: [email protected]/Username/Repositor, hapus // berfungsi untuk saya. Thx
AliasCocoa
23

Memperbarui

Seperti yang disebutkan @felix dalam komentar (terima kasih @felix), penggunaan deploy tokenjauh lebih relevan untuk membaca registri pribadi di gitlab. Dengan cara ini token dikompromikan, penyerang hanya dapat membaca repositori itu dan tidak dapat membuat perubahan.

Membuat Deploy Token

  1. Masuk ke GitLabakun Anda .
  2. Buka proyek yang ingin Anda buat Deploy Token.
  3. Buka Pengaturan> Repositori.
  4. Klik pada Expandbagian Deploy Tokens.
  5. Pilih nama dan tanggal kadaluwarsa untuk token opsional.
  6. Pilih cakupan yang diinginkan. <= pilihread_repository
  7. Klik Buat token penerapan.
  8. Simpan token penerapan di tempat yang aman. Setelah Anda keluar atau menyegarkan halaman, Anda tidak akan dapat mengaksesnya lagi.

Jawaban lama

Goto User Settings > Access Tokensdan buat yang baru access tokendengan read_registryizin.

masukkan deskripsi gambar di sini

Salinan dibuat token, kami membutuhkannya untuk package.jsonfile kami .

masukkan deskripsi gambar di sini

Sekarang package.jsontambahkan dependencyseperti di bawah ini:

"my-module": "git+https://Xaqron:[email protected]/Xaqron/my-module"

Ganti Xaqrondengan nama pengguna Anda dan tokendengan token yang dibuat. Anda dapat menentukan branchdan tagdi akhir url dengan #{branch|tag}.

Catatan: Karena token akses terletak di package.jsonsiapa pun yang memiliki akses ke proyek ini dapat membaca repositori, jadi saya menganggap proyek Anda bersifat pribadi.

Xaqron
sumber
5
Cara lainnya adalah dengan membuat Deploy Token untuk repositori tertentu. Maka itu tidak memberikan akses baca untuk semua repo Anda. "private-module": "git+https://gitlab+deploy-token-username:[email protected]/you/project",
Chris Sattinger
npm ERR! enoent undefined ls-remote -h -t https://puump:[email protected]/puump/puump-content.git
chovy
2
@chovy: Instal git lihat
Xaqron
2
Saya juga ingin menunjukkan bahwa jika proyek Anda berada di dalam grup, maka Anda harus mendefinisikan ini "private-module": "git+https://gitlab+deploy-token-username:[email protected]/group_name/project"your usernamegroup_name
:,
8

Meskipun pertanyaannya tentang Gitlab, pertanyaan ini memiliki peringkat yang cukup baik di pencarian google, jadi berikut adalah beberapa informasi lebih lanjut tentang cara memperbaiki masalah serupa yang saya dapatkan dengan Github.

Bagi saya, hanya mengubah url saja tidak berhasil. Berikut langkah-langkah yang harus saya ambil untuk memperbaikinya:

  • git+ssh://[email protected]:owner/repo.git#master
  • Buat kunci penerapan dan tambahkan ke repo
  • Edit git config ( ~/.ssh/configbuat file jika tidak ada) untuk memaksa penggunaan DeployKey alih-alih kunci ssh default

Setelah itu npm install langsung bekerja. Semua opsi dan solusi lain mengakibatkan kerusakan instalasi npm

Sephy
sumber
itu pasti salah ketik. :owner?
chovy
1
apa yang saya lakukan dengan ~/.ssh/config? Saya masih belum selesai dengan npm / gitlab
chovy
6

Hanya untuk orang lain yang menemukan ini, saya tidak bisa membuatnya bekerja melalui HTTPS sama sekali - tampaknya itu tidak mendukung tautan langsung ke repo (misalnya https://git.domain.com/user/somerepo.git), juga tidak mendukung .tar, .tar.bzatau .zipversi arsip.

Tampaknya hanya berfungsi dengan .tar.gzarsip.

Contoh lengkap (dengan versi yang diberi tag):

https://git.domain.com/user/somerepo/repository/archive.tar.gz?ref=v1.2.3

chrisf
sumber
5

Tidak ada jawaban lain yang berhasil untuk saya untuk repo gitlab.com pribadi ...

Namun ini berfungsi:

npm i -S git+ssh://[email protected]:<org>/<project>.git

Ini hanya git ssh clone url dari kolom input "clone" halaman proyek dengan git+ssh://ditambahkan ke depannya.

chovy
sumber
1
ini berfungsi, mengingat kunci publik ssh Anda sudah disiapkan di akun gitlab.
lasec0203
3

Sejauh yang saya tahu di mana Anda salah adalah git://protokolnya. GitLab hanya mendukung HTTP (s) dan SSH untuk klon. Jadi, Anda harus menggunakan salah satu metode tersebut, bukan protokol git.

Sam Gleske
sumber
3

Bagi saya, atur package.json seperti di bawah ini.

"dependencies": {
    "<module-name>": "git+http://<username>:<token>@url.git",
}

Token ini didapat dari "Pengaturan Profil - Token Akses" Anda.

shentaoy
sumber
Ini berhasil juga untuk saya. Saya bekerja di belakang proxy dengan sertifikat yang ditandatangani sendiri.
Stefano Mozart
ini sebenarnya berhasil untuk saya tetapi saya bertanya-tanya apakah itu ide yang baik untuk meninggalkan token di package.json karena orang lain mungkin menggunakannya untuk menulis? gitlab (setidaknya dalam kasus saya) tidak mengizinkan saya membuat token akses hanya baca tetapi hanya token akses penuh. Bagaimana menurut anda?
cancerbero
Catatan: GitLab 10.7 (dirilis April 2018) menambahkan "Deploy Tokens" level project. Ini harus digunakan sebagai pengganti "Token Akses" tingkat pengguna. tautan dokumen
0

Jika Anda ingin menggunakan variabel lingkungan yang memegang token alih-alih token yang di-hardcode di URL, saya datang dengan solusi yang bahkan cukup rumit. Kami akan menggunakan GIT_ASKPASSvariabel lingkungan untuk mendapatkan kata sandi dari skrip bash, skrip ini akan menggemakan variabel lingkungan. Untuk mengatasi npm hanya melewatkan variabel lingkungan GIT tertentu yang akan kita gunakan GIT_SSHsebagai perantara.

Jadi, diberikan git_pass_env.shberisi echo $GIT_SSHkita bisa memanggil:

GIT_SSH=<TOKEN> GIT_ASKPASS="$(pwd)/git_pass_env.sh" npm install

Untuk contoh proyek dengan buruh pelabuhan dan buruh pelabuhan-menulis lihat repo saya di sini .

Diagram alir variabel lingkungan:

diagram alir

YoniXw
sumber
0

Gitlab sekarang memiliki registri paket yang memungkinkan untuk membangun, menerapkan, dan menghosting paket npm. Dengan repositori pribadi, dimungkinkan untuk memberikan kontrol akses yang halus atas konten repositori dan paket.

Paket NPM dapat diinstal dari repositori Gitlab pribadi dengan menambahkan .npmrcfile bersama package.json. Info selengkapnya di sini . Meskipun menjadi rumit saat menggunakan beberapa token penerapan untuk repositori yang berbeda dalam basis kode yang sama.

Dengan Gitlab, Anda dapat mengakses .tgzfile paket secara langsung dengan HTTPS dan menerapkan token . Cukup tambahkan ketergantungan proyek seperti ini:

"@foo/bar": "https://<username>:<token>@gitlab.com/api/v4/projects/<project-id>/packages/npm/@foo/bar/-/@foo/bar-1.0.0.tgz"

@ foo / bar ada dua kali di URL. @foo adalah cakupan proyek dan bar adalah nama modul dan 1.0.0 adalah nama modul. project-id (8 digit numerik) adalah project ID Gitlab, yang bisa dilihat dari halaman project di bawah namanya. Bahkan mungkin untuk menghilangkan @foo dari nama modul (tapi bukan tautannya).

Menggunakan beberapa modul dengan cakupan yang sama dan token penerapan yang berbeda membuat pengelolaan repositori pribadi menjadi aman. Juga Deploy token mungkin hanya memiliki akses package registryyang artinya, pengguna akhir tidak akan dapat mengakses kode sumber lengkap dari repositori.

Palash Bansal
sumber