npm installa da Git in una versione specifica


181

Supponendo di aver scritto un modulo per Node.js che vorrei mantenere privato. So che posso (dovrebbe) aggiungere la riga:

"private": "true"

al package.jsonfile e so anche che posso npm installquesto modulo usando un percorso del file system o un collegamento a un repository git, incluso GitHub.

So anche che posso inserire un tale percorso del file system o un collegamento a un repository git package.json, in modo che la dependenciesparte possa assomigliare a questa:

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

Quello che voglio ora non è il collegamento all'ultima versione, ma a una specifica. L'unica possibilità che conosco è quella di collegarsi a un commit specifico usando il suo ID. Ma questo è molto meno leggibile e peggio mantenibile rispetto all'utilizzo di un numero di versione come 0.3.1.

Quindi la mia domanda è: è possibile specificare un tale numero di versione e fare in modo che npm cerchi nel repository git l'ultimo commit che includa questa versione?

In caso contrario, come risolvi questo problema nei tuoi progetti? Vivi con ID di commit o esiste una soluzione migliore a questo?

Risposte:


193

Deve essere disponibile una dipendenzaregistry da installare semplicemente specificando un versiondescrittore .

Puoi certamente creare e utilizzare il tuo registro invece che registry.npmjs.orgse i tuoi progetti non devono essere condivisi pubblicamente.

Ma, se non è in un registro, dovrà fare riferimento a URL o Git URL . Per specificare una versione con un URL Git, includi un appropriato <commit-ish>, come un tag, alla fine come un frammento di URL .

Esempio, per un tag chiamato 0.3.1:

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

Nota : lo snippet sopra mostra l'URL di base come è stato pubblicato nella domanda.

La parte snipped ( ...) deve essere compilata:

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

Inoltre, sarà necessario un formato di indirizzo diverso quando l'accesso SSH non è disponibile:

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

A seconda del sistema operativo, potresti anche essere in grado di linkdipendere da un'altra cartella in cui è stato clonato da Github.


1
Sembra che alcuni dei link in questo post siano obsoleti, poiché portano invece a 404 pagine. È un peccato, dato che alcune di queste sono informazioni che cerco da un po 'di tempo.
MvG

5
Ho taggato una versione specifica con git tag -a "1.0.0"e git push --tagsho premuto , quindi ho aggiunto il #v1.0.0alla fine della git+sshdipendenza. Ma npm updatenon succede nulla.
Loretoparisi,

3
@loretoparisi Siamo spiacenti. Non intendevo suggerire che vfosse necessario aggiungere . Dopo la #, il frammento deve corrispondere il nome completo del tag (o altro commitsh ) - nel tuo caso, #1.0.0.
Jonathan Lonowski,

A partire da luglio 2016, l'hosting del proprio registro è diventato più complicato mentre si spostano da couchdb a microservizi
Yan Foto

3
Ora puoi fare npm i {owner}/{project}#{tag}o aggiungere "{library}": "github:{owner}/{project}#{tag}"a package.json invece di usare git@github.comogit://github.com
Mike W

238

La risposta accettata non ha funzionato per me. Ecco cosa sto facendo per estrarre un pacchetto da github:

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

O aggiungendolo manualmente su package.json:

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

41
Se stai usando http / https, assicurati di includere il prefisso "git +":"package": "git+https://github.com/username/package.git#commit"
Ates Goral

4
Questo ha funzionato fino a "npm install" ma quando ho provato a eseguire la mia applicazione il requisito ('mymodule') non è riuscito a trovare il suo pacchetto. Anche se il pacchetto si trova nella directory node_modules con lo stesso nome.
Derrick,

Oh, il modulo in questione non includeva la build con il commit specifico che volevo, quindi se hai lo stesso problema potresti doverlo compilare manualmente.
Derrick,

1
puoi anche usare ciò #tagche di solito indica un numero di versione
deltree

1
@surjikal devi taggare un rilascio prima di poter usare i numeri di versione con git. ad esempio, git tag -a v1.0.1 && git push --tag && git pushcome ha detto anche @Jonathan Lonowski in un commento.
dotnetCarpenter,

80

Se per versione intendi un tag o una versione, github fornisce link per il download per quelli. Ad esempio, se voglio installare fetch versione 0.3.2 (non è disponibile su npm), allora aggiungo al mio package.jsonsotto dependencies:

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

L'unico svantaggio rispetto all'approccio con hash di commit è che un hash è garantito per non rappresentare il codice modificato, mentre un tag potrebbe essere sostituito. Per fortuna questo accade raramente.

Aggiornare:

In questi giorni l'approccio che uso è la notazione compatta per una dipendenza servita da GitHub:

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

Dove commit può essere qualsiasi cosa di commit, come un tag. Nel caso di GitHub puoi anche eliminare l'iniziale github:poiché è l'impostazione predefinita.


La modalità archivio funziona anche per i commit; ad esempio, `filato aggiungere github.com
github

Soluzione più pulita.
Charley Bodkin,

8

Il mio commento di esempio a @qubyte sopra è stato tagliato, quindi ecco qualcosa che è più facile da leggere ...

Il metodo @surjikal descritto sopra funziona per i commit di branch, ma non ha funzionato per un commit ad albero che stavo cercando di includere.


La modalità di archiviazione funziona anche per i commit. Ad esempio, recupera @ a2fbf83

npm :

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

filato :

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

formato :

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


Ecco il commit dell'albero che ha richiesto la /archive/modalità:

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

per il relativo commit vuex


8

Questo comando installa il pacchetto npm username/packageda git commit specifico:

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

Ecco i 3d0a21ccprimi 8 caratteri dell'hash di commit.


3

Descrivo qui un problema che ho riscontrato durante l'esecuzione npm install: il pacchetto non viene visualizzato node_modules.

Il problema era che il namevalore package.jsondel pacchetto installato era diverso dal nome del pacchetto importato (chiave nel package.jsonmio progetto).

Così, se il nome del progetto installato è some-package(valore nome nella sua package.json) e poi in package.jsondella vostra scrittura del progetto: "some-package": "owner/some-repo#tag".


Vorrei aver trovato la tua risposta prima 😓 - Ho appena risolto, con lo stesso problema che mi ha fatto lottare per un po '; e questo namerequisito non è menzionato spesso in rete .. (non che potrei incorrere in quello, almeno).
Kamafeather,

"Aggiungi le dipendenze dei pacchetti a package.json specificando il nome completo del pacchetto con ambito." - Non lo sottolineo davvero: help.github.com/en/articles/…
Kamafeather,

Ho scoperto che npm install --save git+https://<remote-github-repo-url>è un modo abbastanza sicuro per non affrontare nuovamente questo problema in futuro.
Kamafeather,

2

Avevo bisogno di eseguire due versioni di tfjs-core e ho scoperto che entrambe dovevano essere costruite dopo l'installazione.

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

Poi:

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

E infine, per usare le librerie:

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

Ha funzionato alla grande ma è sicuramente #hoodrat


1
Grazie, ho cercato di importarlo in ogni altro modo immaginabile. Ho dovuto vedere il tuo frammento per rendermi conto che dovevo importare direttamente dal file.
Victor Ivens,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.