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.