2013-01-06 15 views
97

Supposto che abbia scritto un modulo per Node.js che vorrei mantenere privato. So che posso (devo) aggiungere la linea:npm installazione da Git in una versione specifica

"private": "true" 

al file package.json, e so anche che posso npm install questo modulo utilizza un percorso di file di sistema o un link a un repository git, tra cui GitHub.

so anche che posso mettere un tale percorso del file system o un collegamento a un repo git in package.json, in modo che la parte dependencies può sembrare un po 'come questo:

"dependencies": { 
    "myprivatemodule": "[email protected]:..." 
} 

Quello che ora voglio non è per collegare alla versione più recente, ma a una specifica. L'unica possibilità che conosco è quella di collegarsi a uno specifico commit usando il suo ID. Ma questo è il modo meno leggibile e meno conservabile rispetto all'utilizzo di un numero di versione come 0.3.1.

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

In caso contrario, come si risolve questo problema nei progetti? Vivi con ID di commit o c'è una soluzione migliore per questo?

risposta

116

A dependency deve essere disponibile dal registry da installare solo da specifying a version descriptor.

Si può certamente create and use your own registry invece di registry.npmjs.org se i propri progetti non devono essere condivisi pubblicamente.

Tuttavia, se non si trova in un registro, sarà necessario fare riferimento a URL o Git URL. Per specificare una versione con un URL Git, includere uno <commit-ish> appropriato, ad esempio un tag, alla fine come URL fragment.

Esempio, per un tag di nome 0.3.1:

"dependencies": { 
    "myprivatemodule": "[email protected]:...#0.3.1" 
} 

Nota: È possibile che questo frammento di codice mostra l'URL di base lo stesso che è stato pubblicato in questione.

La porzione snipped (...) deve essere compilato:

"myprivatemodule": "[email protected]:{owner}/{project}.git#0.3.1" 

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

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

A seconda del tuo sistema operativo, potresti anche essere in grado di link per la dipendenza in un'altra cartella in cui hai clonato da G ithub.

+0

Sembra alcuni dei link in questo post sono obsoleti, dato che portano ad 404 pagine, invece. È un peccato, dato che alcune di queste informazioni sono state alla ricerca da un po 'di tempo. – MvG

+0

@MvG Ah, grazie. I collegamenti sono stati aggiornati. –

+2

Ho taggato una versione specifica con 'git tag -a" 1.0.0 "' e ho premuto 'git push --tags', poi ho aggiunto' # v1.0.0' alla fine della dipendenza 'git + ssh'. Ma all'aggiornamento di 'npm non succede niente. – loretoparisi

1

Se stai facendo questo con più di un modulo e vuoi avere più controllo sulle versioni, dovresti cercare di avere il tuo registro privato di npm.

In questo modo è possibile pubblicare i moduli sul proprio registro di npm privato e utilizzare il pacchetto.voci json come faresti per i moduli pubblici.

https://docs.npmjs.com/files/package.json#dependencies

+0

Tutti i collegamenti sono 404 –

144

La risposta accettata non ha funzionato per me. Ecco quello che sto facendo tirare un pacchetto da github:

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

concordati; modificata risposta accettata per fare riferimento alla sintassi corretta – toblerpwn

+16

Se si utilizza http/https, assicurarsi di includere il prefisso "git +": '" pacchetto ":" git + https: //github.com/username/package.git#commit "' –

+1

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

45

Se per la versione si intende un tag o un rilascio, quindi github fornisce link di download per quelli. Per esempio, se voglio installare fetch versione 0.3.2 (non è disponibile sul NPM), poi aggiungo alla mia package.json sotto dependencies:

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

L'unico svantaggio se confrontato con l'approccio commettere hash è che è garantito che un hash non rappresenta il codice modificato, mentre un tag potrebbe essere sostituito. Per fortuna capita raramente.

Aggiornamento:

In questi giorni l'approccio che uso è la notazione compatta per un GitHub servito dipendenza:

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

Dove commettere può essere nulla commitish, come un tag. Nel caso di GitHub puoi persino eliminare l'iniziale github: poiché è l'impostazione predefinita.

+11

Il down-voting va bene, ma ti preghiamo di considerare di lasciare un commento in modo da poter migliorare questa risposta. – qubyte

+2

Non so perché sia ​​downvoted, il tuo consiglio aggiornato è quello che mi serve - grazie –

+0

Non penso che funzioni con npm v5.5.1 – Murilo

1

Il mio esempio commento a @qubyte above ottenuto tritato, quindi ecco qualcosa che è più facile da leggere ...

Il metodo descritto @surjikal above lavori alla succursale impegna, ma non ha funzionato per un albero impegno che stavo provando includere.


La modalità di archiviazione funziona anche per i commit. Ad esempio, fetch @ 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 l'albero commettere che ha richiesto la modalità /archive/:

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

per il relativo vuex commit

Problemi correlati