instalacja npm z Git w określonej wersji


181

Zakładając, że napisałem moduł dla Node.js, który chciałbym zachować jako prywatny. Wiem, że mogę (powinienem) dodać wiersz:

"private": "true"

do package.jsonpliku, a także wiem, że mogę npm installten moduł użyć ścieżki systemu plików lub łącza do repozytorium git, w tym GitHub.

Wiem również, że mogę umieścić taką ścieżkę do systemu plików lub łącze do repozytorium git package.json, aby dependenciesczęść mogła wyglądać mniej więcej tak :

"dependencies": {
  "myprivatemodule": "git@github.com:..."
}

Teraz chcę nie link do najnowszej wersji, ale do konkretnej. Jedyną możliwą możliwością jest połączenie z konkretnym zatwierdzeniem przy użyciu jego identyfikatora. Ale jest to o wiele mniej czytelne i gorzej konserwowalne niż przy użyciu numeru wersji takiego jak 0.3.1.

Więc moje pytanie brzmi: czy można podać taki numer wersji i zmusić npm do przeszukania repozytorium git w poszukiwaniu ostatniego zatwierdzenia zawierającego tę wersję?

Jeśli nie, w jaki sposób rozwiązujesz ten problem w swoich projektach? Czy mieszkasz z identyfikatorami zatwierdzeń, czy jest na to lepsze rozwiązanie?

Odpowiedzi:


193

Zależność musi być dostępny od registrybyć instalowane tylko przez podanie versiondeskryptor .

Z pewnością możesz utworzyć własny rejestr i korzystać z niego, zamiast registry.npmjs.orgjeśli projekty nie powinny być udostępniane publicznie.

Ale jeśli nie ma go w rejestrze, konieczne będzie odwołanie do niego za pomocą adresu URL lub adresu URL Git . Aby określić wersję z adresem URL Git, dołącz odpowiedni fragment <commit-ish>, taki jak tag, na końcu jako fragment adresu URL .

Przykład dla znacznika o nazwie 0.3.1:

"dependencies": {
  "myprivatemodule": "git@github.com:...#0.3.1"
}

Uwaga : powyższy fragment pokazuje podstawowy adres URL taki sam, jak został opublikowany w pytaniu.

Część wyciętą ( ...) należy wypełnić:

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

Ponadto potrzebny będzie inny format adresu, gdy dostęp SSH jest niedostępny:

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

W zależności od systemu operacyjnego zależność może znajdować się linkw innym folderze, w którym została sklonowana z Github.


1
Wygląda na to, że niektóre linki w tym poście są nieaktualne, ponieważ prowadzą do 404 stron. Szkoda, ponieważ część z nich to informacje, których szukałem od dłuższego czasu.
MvG,

5
Oznacziłem określoną wersję za pomocą git tag -a "1.0.0"i wypchnąłem git push --tags, a następnie dodałem #v1.0.0na końcu git+sshzależności. Ale npm updatenic się nie dzieje.
loretoparisi,

3
@loretoparisi Przepraszamy. Nie chciałem sugerować, że dodanie vbyło konieczne. Po #The fragment powinien pasować pełną nazwę tagu (lub innego commitsh ) - w twoim przypadku #1.0.0.
Jonathan Lonowski,

Od lipca 2016 r. Hosting własnego rejestru stał się bardziej skomplikowany, ponieważ przechodzą z couchdb do mikrousług
Yan Foto

3
Możesz teraz zrobić npm i {owner}/{project}#{tag}lub dodać "{library}": "github:{owner}/{project}#{tag}"do package.json zamiast używać git@github.comlubgit://github.com
Mike W

237

Przyjęta odpowiedź nie działała dla mnie. Oto, co robię, aby pobrać pakiet z github:

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

Lub dodając go ręcznie w pliku package.json:

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}

41
Jeśli używasz http / https, upewnij się, że podałeś prefiks „git +”:"package": "git+https://github.com/username/package.git#commit"
Ates Goral

4
Działa to tak daleko, jak „instalacja npm”, ale kiedy próbowałem uruchomić aplikację, wymagany („mymodule”) nie znalazł pakietu. Mimo że pakiet znajduje się w katalogu node_modules o tej samej nazwie.
Derrick

Och, moduł, o którym mowa, nie zawierał kompilacji z konkretnym zatwierdzeniem, którego chciałem, więc jeśli masz ten sam problem, być może będziesz musiał go zbudować ręcznie.
Derrick

1
możesz także użyć tego, #tagktóry zwykle wskazuje na numer wersji
deltree

1
@surjikal musisz oznaczyć wydanie, zanim będziesz mógł używać numerów wersji z git. np. git tag -a v1.0.1 && git push --tag && git pushjak powiedział w komentarzu Jonathan Lonowski.
dotnetCarpenter

80

Jeśli przez wersję masz na myśli tag lub wydanie, github zapewnia linki do ich pobrania. Na przykład, jeśli chcę zainstalować pobieranie wersji 0.3.2 (nie jest dostępna na npm), dodaję do mojej package.jsonpod dependencies:

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

Jedyną wadą w porównaniu z metodą skrótu zatwierdzania jest to, że hash nie gwarantuje zmiany kodu, podczas gdy znacznik może zostać zastąpiony. Na szczęście rzadko się to zdarza.

Aktualizacja:

Obecnie używam metody zwięzłej notacji dla zależności obsługiwanej przez GitHub:

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

Gdzie zatwierdzenie może być dowolnym zatwierdzeniem, np. Tagiem. W przypadku GitHub możesz nawet usunąć początkową, github:ponieważ jest ona domyślna.


Tryb archiwizacji działa również dla zatwierdzeń; np. „przędza dodaj github.com
github

Najczystsze rozwiązanie.
Charley Bodkin

8

Mój przykładowy komentarz do @qubyte powyżej został pocięty, więc oto coś, co jest łatwiejsze do odczytania ...

Opisana powyżej metoda @surjikal działa dla zatwierdzeń gałęzi, ale nie działała dla zatwierdzenia drzewa, które próbowałem włączyć.


Tryb archiwizacji działa również dla zatwierdzeń. Na przykład fetch @ a2fbf83

npm :

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

przędza :

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

format :

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


Oto drzewo zatwierdzające, które wymagało /archive/trybu:

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

dla powiązanego zatwierdzenia Vuex


8

To polecenie instaluje pakiet npm username/packagez określonego git commit:

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

Oto 3d0a21ccpierwsze 8 znaków skrótu zatwierdzenia.


3

Opisuję tutaj problem, który napotkałem podczas uruchamiania npm install- pakiet nie pojawia się w node_modules.

Problem polegał na tym, że namewartość w package.jsonzainstalowanym pakiecie była inna niż nazwa importowanego pakietu (klucz package.jsondo mojego projektu).

Więc jeśli zainstalowanych jest nazwa projektu some-package(wartość nazwą w package.json), a następnie w package.jsonswojej zapisu projektu: "some-package": "owner/some-repo#tag".


Chciałbym znaleźć twoją odpowiedź wcześniej 😓 - właśnie rozwiązałem ten sam problem, przez co zmagałem się przez chwilę; i ten namewymóg nie jest często wymieniany w sieci. (przynajmniej nie mogłem tego ponieść).
Kamafeather

„Dodaj zależności pakietu do pliku package.json, podając pełną nazwę pakietu.” - Nie bardzo to podkreślam: help.github.com/en/articles/…
Kamafeather

Dowiedziałem się, że npm install --save git+https://<remote-github-repo-url>jest to dość bezpieczny sposób, aby nie napotykać tego problemu w przyszłości.
Kamafeather

2

Musiałem uruchomić dwie wersje tfjs-core i stwierdziłem, że obie muszą zostać zbudowane po instalacji.

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

Następnie:

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

I wreszcie, aby skorzystać z bibliotek:

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';

Działa to świetnie, ale z pewnością jest #hoodrat


1
Dziękuję, starałem się zaimportować to na wszystkie inne możliwe sposoby. Musiałem zobaczyć Twój fragment, aby zdać sobie sprawę, że muszę zaimportować bezpośrednio z pliku.
Victor Ivens

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.