Installieren Sie das npm-Modul aus dem privaten gitlab-Repository

96

Wir verwenden GitLab für unser privates Projekt. Es gibt einige gegabelte Bibliotheken von github, die wir als npm-Modul installieren möchten. Die Installation dieses Moduls direkt von npm ist in Ordnung und zum Beispiel:

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

... funktioniert auch richtig, aber wenn ich dasselbe für GitLab mache, bekomme ich nur diesen Fehler, wenn ich die Domain wechsle.

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

Über die Weboberfläche von GitLab habe ich diese URL [email protected]:library/grunt-stylus-sprite.git. Wenn Sie dies ausführen npm install, wird versucht, das gitModul aus der npm-Registrierung zu installieren .

Die Verwendung von URL: [email protected]:library/grunt-stylus-sprite.gitfragt mich plötzlich nach dem Passwort. Mein SSH-Schlüssel enthält keine Passphrase, daher gehe ich davon aus, dass er diesen Schlüssel nicht laden konnte. Vielleicht gibt es eine Konfiguration, die ich verpasst habe? Der Schlüssel befindet sich an der Standardposition in meinem Home-Verzeichnis mit dem Namen "id_rsa".

Ich bin auf Windows 7 x64.

AKTUALISIEREN

Seit NPM v3 gibt es eine integrierte Unterstützung für GitLab und andere Quellen (BitBucket, Gist), von denen aus Sie Pakete installieren können. Leider funktioniert es nur für öffentliche, so dass es nicht genau damit zusammenhängt, aber einige finden es möglicherweise nützlich.

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

Lesen Sie die Dokumentation: https://docs.npmjs.com/cli/install

FredyC
quelle
1
Was ist die tatsächliche Gitlab-URL, die ich verwende? Ich sehe nur, dass <placeholders>ich verschiedene Variationen ausprobiert habe und es steht immer noch, dass das Projekt nicht gefunden wurde.
Chovy
1
$ npm i -S git+ssh://[email protected]/org/repo.gitfunktioniert nicht
chovy

Antworten:

156

Sie haben die folgenden Methoden, um eine Verbindung zu einem privaten Gitlab-Repository herzustellen

Mit SSH

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

Mit HTTPS

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

Mit HTTPS und Token bereitstellen

git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}
Sidhuko
quelle
Ja, das habe ich so ziemlich herausgefunden. Sie können sogar einen Zweig oder ein Tag wie angeben Repository#1.2.3. Ich werde das Antwort-Häkchen ändern, da dies genauer ist.
FredyC
1
@ Jamessidhu Ich bin nicht sicher, aber es fragt mich Passwort auch mit SSH. Wenn ich ein Passwort gebe, erhalte ich einen Fehler. Irgendeine Idee, wie man es löst?
Codesnooker
@codesnooker Hast du einen SSH-Schlüssel in Gitlab eingerichtet ? Wenn zwischen Ihrem Computer und der Fernbedienung keine Schlüssel autorisiert sind, wird standardmäßig ein Kennwort wie der Zugriff auf einen Server verwendet.
Sidhuko
5
Dies funktioniert bei mir eigentlich nur mit echter URL-Syntax, zB git+ssh://[email protected]/Username/Repository(beachten Sie den / trennenden Host und Benutzernamen). Dies kann eine garnspezifische Sache sein, vielleicht funktioniert das vorgeschlagene Beispiel mit npm
Ivo van der Wijk
1
Das Bereitstellen von Token funktioniert hervorragend. <token-name>Im Beispiel sieht es so aus gitlab+deploy-token-17034, als wäre es nicht der willkürliche Name, den Sie dem Token zuweisen.
Mr5o1
26

Stattdessen git://sollten use git+ssh://und npm das Richtige tun.

isaacs
quelle
5
Antwort von npm Schöpfer selbst 👆
Dmitry Parzhitsky
Ich erhalteundefined ls-remote <url>
Chovy
git + ssh: [email protected]/Username/Repositor, entferne // es funktioniert bei mir. Thx
AliasCocoa
22

Aktualisieren

Wie @felix in den Kommentaren erwähnt hat (danke @felix), deploy tokenist die Verwendung für das Lesen einer privaten Registrierung auf viel relevanter gitlab. Auf diese Weise wird das Token kompromittiert. Der Angreifer kann das Repository nur lesen und keine Änderungen vornehmen.

Erstellen eines Bereitstellungstokens

  1. Melden Sie sich bei Ihrem GitLabKonto an.
  2. Wechseln Sie zu dem Projekt, für das Sie Bereitstellungstoken erstellen möchten.
  3. Gehen Sie zu Einstellungen> Repository.
  4. Klicken Sie auf den ExpandAbschnitt Token bereitstellen.
  5. Wählen Sie einen Namen und optional ein Ablaufdatum für das Token.
  6. Wählen Sie die gewünschten Bereiche. <= auswählenread_repository
  7. Klicken Sie auf Bereitstellungstoken erstellen.
  8. Speichern Sie das Bereitstellungstoken an einem sicheren Ort. Sobald Sie die Seite verlassen oder aktualisiert haben, können Sie nicht mehr darauf zugreifen.

Alte Antwort

Gehe zu User Settings > Access Tokensund erstelle ein neues access tokenmit read_registryErlaubnis.

Geben Sie hier die Bildbeschreibung ein

Kopie generiert token, wir brauchen es für unsere package.jsonDatei.

Geben Sie hier die Bildbeschreibung ein

Fügen package.jsonSie nun dependencyFolgendes hinzu:

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

Ersetzen Sie Xaqrondurch Ihren Benutzernamen und tokendurch das generierte Token. Sie können angeben branchund tagam Ende der URL durch #{branch|tag}.

Hinweis: Da sich das Zugriffstoken in package.jsonjedem befindet, der Zugriff auf dieses Projekt hat, kann es das Repository lesen. Ich gehe daher davon aus, dass Ihr Projekt selbst privat ist.

Xaqron
quelle
5
Die andere Möglichkeit besteht darin, ein Bereitstellungstoken für dieses bestimmte Repository zu erstellen. Dann wird nicht für alle Repos Lesezugriff gewährt. "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: Installieren git siehe
Xaqron
Ich möchte auch darauf hinweisen, dass Sie, wenn sich Ihr Projekt in einer Gruppe befindet, "private-module": "git+https://gitlab+deploy-token-username:[email protected]/group_name/project"your usernamegroup_name
Folgendes
8

Obwohl es sich bei der Frage um Gitlab handelt, ist diese Frage in der Google-Suche recht gut platziert. Hier finden Sie weitere Informationen zum Beheben eines ähnlichen Problems, das ich mit Github erhalten habe.

Für mich hat es nur funktioniert, wenn ich nur die URL geändert habe. Hier sind die Schritte, die ich unternehmen musste, um dies zu beheben:

  • git+ssh://[email protected]:owner/repo.git#master
  • Erstellen Sie einen Bereitstellungsschlüssel und fügen Sie ihn dem Repo hinzu
  • Bearbeiten Sie die Git-Konfiguration ( ~/.ssh/configerstellen Sie die Datei, falls sie nicht vorhanden ist), um die Verwendung des DeployKey anstelle des Standard-SSH-Schlüssels zu erzwingen

Danach hat die npm-Installation einfach funktioniert. Alle anderen Optionen und Lösungen resultierten aus dem Bruch der npm-Installation

Sephy
quelle
das muss ein Tippfehler sein. :owner?
Chovy
1
was ich tun mit ~/.ssh/config? Ich komme immer noch nicht mit npm / gitlab durch
chovy
6

Nur für alle andere , die über diese stolpert, konnte ich es überhaupt nicht bekommen arbeitet über HTTPS - scheint es nicht den Link zu dem Repo (zB nicht unterstützt https://git.domain.com/user/somerepo.git), noch nicht unterstützt das .tar, .tar.bzoder .zipArchiv - Versionen.

Es scheint nur mit dem .tar.gzArchiv zu funktionieren .

Vollständiges Beispiel (mit markierter Version):

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

chrisf
quelle
4

Keine der anderen Antworten hat für mich für ein privates Repo von gitlab.com funktioniert ...

Dies funktioniert jedoch:

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

Es ist nur die git ssh-Klon-URL aus dem Eingabefeld "Klon" der Projektseite git+ssh://, die vorne hinzugefügt wurde.

chovy
quelle
1
Dies funktioniert, da Ihr öffentlicher SSH-Schlüssel bereits auf dem Gitlab-Konto eingerichtet ist.
lasec0203
3

Soweit ich das beurteilen kann, ist das git://Protokoll falsch . GitLab unterstützt nur HTTP (s) und SSH für Klone. Sie müssen also eine dieser Methoden anstelle des Git-Protokolls verwenden.

Sam Gleske
quelle
3

Für mich setzt die package.json wie folgt funktioniert.

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

Das Token erhalten Sie von Ihren "Profileinstellungen - Zugriffstoken".

Shentaoy
quelle
Das hat auch bei mir funktioniert. Ich arbeite hinter einem Proxy mit selbstsigniertem Zertifikat.
Stefano Mozart
Das hat bei mir tatsächlich funktioniert, aber ich frage mich, ob es eine gute Idee ist, das Token in package.json zu belassen, da andere es möglicherweise zum Schreiben verwenden. Mit gitlab (zumindest in meinem Fall) kann ich kein schreibgeschütztes Zugriffstoken erstellen, sondern nur ein Vollzugriffstoken. Was denken Sie?
Cancerbero
Hinweis: GitLab 10.7 (veröffentlicht im April 2018) hat "Deploy Tokens" auf Projektebene hinzugefügt. Diese sollten anstelle eines "Zugriffstokens" auf Benutzerebene verwendet werden. docs link
0

Wenn Sie eine Umgebungsvariable verwenden möchten, die das Token anstelle des fest codierten Tokens in der URL enthält, habe ich eine Lösung gefunden, die selbst schwierig und recht komplex ist. Wir werden die GIT_ASKPASSUmgebungsvariable verwenden, um das Passwort von einem Bash-Skript abzurufen. Dieses Skript gibt eine Umgebungsvariable wieder. Um zu überwinden, dass npm nur bestimmte GIT-Umgebungsvariablen übergibt, werden wir GIT_SSHals Middle Man verwenden.

Also, da git_pass_env.shenthalten echo $GIT_SSHwir einfach anrufen:

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

Ein Beispielprojekt mit Docker und Docker-Compose finden Sie in meinem Repo hier .

Flussdiagramm der Umgebungsvariablen:

Flussdiagramm

YoniXw
quelle
0

Gitlab verfügt jetzt über eine Paketregistrierung, in der npm-Pakete erstellt, bereitgestellt und gehostet werden können. Mit privaten Repositorys ist es möglich, eine genaue Zugriffskontrolle über den Repository-Inhalt und die Pakete bereitzustellen.

NPM-Pakete können aus privaten Gitlab-Repositorys installiert werden, indem eine .npmrcDatei hinzugefügt wird package.json. Mehr Infos hier . Obwohl es kompliziert wird, wenn mehrere Bereitstellungstoken für verschiedene Repositorys in derselben Codebasis verwendet werden.

Mit Gitlab ist es möglich, .tgzdirekt mit HTTPS auf die Paketdatei zuzugreifen und Token bereitzustellen . Fügen Sie einfach die Projektabhängigkeit wie folgt hinzu:

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

@ foo / bar ist zweimal in der URL vorhanden. @foo ist der Projektumfang und bar ist der Modulname und 1.0.0 ist der Modulname. Projekt-ID (8-stellig numerisch) ist die Gitlab-Projekt-ID, die auf der Projektseite unter dem Namen angezeigt wird. Es ist sogar möglich, @foo im Modulnamen wegzulassen (aber nicht im Link).

Durch die Verwendung mehrerer Module mit demselben Bereich und unterschiedlichen Bereitstellungstoken wird die Verwaltung privater Repositorys sicher. Deploy-Token haben möglicherweise nur Zugriff, sodass package registryder Endbenutzer nicht über die Repositorys auf den vollständigen Quellcode zugreifen kann.

Palash Bansal
quelle