npm installa e compila il repository github biforcuto


126

Questa non è una domanda del tutto nuova, ma è da un bel po 'che mi guardo intorno e non riesco a trovare una soluzione.

Sto usando un modulo per la mia app angolare chiamato angular-translate. Tuttavia, ho dovuto apportare alcune piccole modifiche al codice sorgente per far funzionare tutto nel modo desiderato, e ora voglio mantenere tali modifiche npm install. Un collega ha suggerito di fare il fork del repo del codice sorgente e di indicare il mio repo forkato come dipendenza, che ho provato in questi modi, ad es.

npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz

Il primo mi dà una directory come questa senza build. Solo un package.json, .npmignore e alcuni file markdown

-angular-translate
   .npmignore 
   .nvmrc
    CHANGELOG.md 
    package.json
    etc

Il secondo npm installmi dà il repository completo, ma ancora una volta non ottengo una build come quando uso il comando npm install angular-translate. Ho visto alcune discussioni sull'esecuzione dello script di pre-pubblicazione, ma non sono sicuro di come farlo durante l'installazione di tutti i moduli. Ho anche provato a pubblicare il fork come modulo personale nel registro npm, ma ancora una volta non ho ricevuto alcuna build e non sono sicuro che sia la cosa giusta da fare ...

Mi scuso per la mia ignoranza sull'argomento. Non ho una grande esperienza con npm. Mi piacerebbe ricevere un feedback su questo problema. Sembra che potrebbe essere un problema abbastanza comune quando è necessario apportare modifiche al codice sorgente di un pacchetto? Forse c'è una soluzione migliore? Grazie in anticipo per il vostro aiuto.

Risposte:


141

Prova npm install <ghusername>/<repoName>, dov'è il <ghUsername>tuo nome utente GitHub (senza @) ed <repoName>è il nome del repository. Questo dovrebbe installarlo correttamente. Molto probabilmente vorrai usare il flag --saveo --save-devcon il comando install per salvare la dipendenza nel tuo file package.json.

Se non funziona correttamente, controlla il contenuto del tuo file .npmignore file.

Non fatevi prendere dal panico se il comando di installazione richiede molto tempo; l'installazione da un repository git è più lenta rispetto all'installazione dal registro npm.


Modificare:

Il tuo problema è che, nel tuo caso, dist/non è impegnato nel repo (poiché è nel file .gitignore). È qui che risiede il codice effettivo. dist/viene src/compilato dai file prima che il pacchetto venga pubblicato nel registro npm, madist/ non viene mai nel repository.

È brutto, ma in questo caso dovrai rimuovere dist/da .gitignoree quindi eseguire:

npm run build
git add .
git commit
git push

(Assicurati di aver eseguito npm install prima)

Dovresti quindi essere in grado di installare da GitHub.

Potrebbe esserci un altro modo per farlo utilizzando uno postinstallscript, ma non sono sicuro che sia possibile; Non l'ho mai provato.


2
Sì, questa era praticamente la soluzione. Ho anche dovuto fare un'installazione di npm e modificare un po 'GruntFile, ma questo l'ha fatto funzionare. Grazie per il vostro aiuto :)
hughesjmh

2
Non c'è davvero altro modo di fare con altro che unignore dist? Voglio fare un PR al repo originale, ma con il dist, non gli piacerà?
Ka Mok

7
@KaMok Penso che un'altra opzione sia, nel package.jsonfile del tuo fork, sotto scripts, rinominare prepublishin prepare. Sembra che quando npm installo npm install github:user_name/fork_name --save(e lo stesso per filato) viene eseguito, esegue anche ciò che è nello preparescript. Ciò presuppone che lo prepublishscript di questo pacchetto crei i file di build, che di solito è il caso.
davidfrancisco

5
e se hai bisogno di una filiale specifica,npm install <ghusername>/<repoName>#branchName
DrMeers

2
@ RyanZim Hai sbagliato. L'installazione da git funziona molto bene fintanto che è impostata correttamente. docs.npmjs.com/cli/install "Se il pacchetto da installare contiene uno preparescript, verrà installato dependenciese devDependenciesverrà installato e lo script di preparazione verrà eseguito prima che il pacchetto venga impacchettato e installato."
Cameron Tacklind

15

Aggiornamento per coloro che utilizzano npm 5:

A partire da npm @ 5, gli prepublishscript sono deprecati.

Utilizzare prepareper passaggi di creazione e solo prepublishOnlyper il caricamento.

Ho scoperto che l'aggiunta di a "prepare": "npm run build"agli script ha risolto tutti i miei problemi.


Ha funzionato anche per me (in una forchetta che ho appena fatto) - grazie! Mi chiedo ... perché tutti i pacchetti non includono solo questa configurazione di script per impostazione predefinita? È perché gli autori di pacchetti considerano solo il caso d'uso di installare il proprio pacchetto da npm e non il caso di installarlo da un repository git? Quindi sono solo abituati a eseguire manualmente npm run builde npm run publishnon incontrano problemi o dolori a meno che un giorno non provino a installare il repository tramite git?
Tyler Rick

9

Il codice pubblicato su npmjs.com spesso non è contenuto nel repository del pacchetto. È comune "compilare" i file sorgente JavaScript in versioni destinate al consumo generale nelle librerie. Questo è ciò che viene solitamente pubblicato su npmjs.com.

È così comune che è una caratteristica di npmeseguire automaticamente un passaggio di "build" prima di pubblicare ( npm publish). Questo era originariamente chiamato prepublish. Sembra che Npm abbia pensato che sarebbe stato utile eseguire lo prepublishscript anche su un filenpm install poiché quello era il modo standard per inizializzare un ambiente di sviluppo.

Ciò ha portato a una grande confusione nella comunità. Ci sono problemi molto lunghi su GitHub su questo.

Alla fine, nel tentativo di non modificare il vecchio comportamento, hanno deciso di aggiungere altri due script automatici: prepublishOnlyeprepare .

prepublishOnlyfa quello che ti aspetti. Non funzionanpm install . Molti manutentori di pacchetti sono passati ciecamente a questo.

Ma c'era anche questo problema che le persone volevano non dipendere da npmjs.com per distribuire le versioni dei pacchetti. I repository Git erano la scelta naturale. Tuttavia è pratica comune non eseguire il commit di file "compilati" in git. Questo è quello cheprepare stato aggiunto per gestire ...

prepare è il modo corretto

Se hai un repository con file sorgenti ma per usarlo è necessario un passaggio di "build",
preparefa esattamente quello che vuoi in tutti i casi (a partire da npm 4).

prepare: Eseguire entrambi PRIMA che il pacchetto venga compresso e pubblicato, in locale npm installsenza argomenti e durante l'installazione delle dipendenze git.

Puoi persino inserire le tue dipendenze di compilazione devDependenciese verranno installate prima preparedell'esecuzione.

Ecco un esempio di un mio pacchetto che utilizza questo metodo.


Problemi con .gitignore

C'è un problema con questa opzione che attira molte persone. Quando si prepara una dipendenza, Npm e Yarn manterranno solo i file elencati nella filessezione di package.json.

Si potrebbe vedere che filestutti i file sono inclusi per impostazione predefinita e pensare che siano finiti. Ciò che è facilmente sfuggito è che per .npmignore lo più sovrascrive la filesdirettiva e , se .npmignorenon esiste, .gitignoreviene utilizzato al suo posto.

Quindi, se avete i file incorporati elencati .gitignorecome una persona sana di mente, e non fare niente altro, preparevi sembrerà rotto

Se decidi filesdi includere solo i file compilati o aggiungi un vuoto .npmignore, sei pronto.

La mia raccomandazione è di impostare files(o, per inversione, .npmignore) in modo tale che gli unici file effettivamente pubblicati siano quelli necessari agli utenti del pacchetto pubblicato. Imho, non è necessario includere sorgenti non compilate nei pacchetti pubblicati.


Risposta originale: https://stackoverflow.com/a/57503862/4612476


1
PREPARE ha funzionato per me invece di POSTINSTALL.i ho appena eseguito npm run build in prepare.
Milind

6

Per cavalcare l'eccellente risposta di @ RyanZim, postinstall è sicuramente un'opzione valida per questo.

O eseguire una delle seguenti operazioni:

  1. Aggiorna il package.json nel tuo repository biforcato per aggiungere un elemento di postinstallazione agli script. Qui, esegui tutto ciò di cui hai bisogno per ottenere l'output compilato (preferito).
  2. Aggiorna il tuo package.json e aggiungi una postinstallazione che aggiorni la directory necessaria in node_modules.

Se hai biforcato il repository di un'altra persona, potrebbe valere la pena sollevare un problema per illustrare il problema che l'installazione del loro pacchetto tramite GitHub non funziona in quanto non fornisce i mezzi necessari per costruire lo script. Da lì, possono accettare un PR per risolverlo con una postinstallazione, oppure possono rifiutarlo e puoi fare # 2.


Puoi spiegare o avere qualche risorsa su come fare # 2? Quali comandi devo eseguire dopo l'installazione di npm quando gitrepo contiene solo src non dist
Daniel

1
@Daniel Apologies, sto cercando di ricordare il contesto in cui l'ho fatto in passato. Penso che per # 2 intendessi aggiungere un passaggio di postinstallazione al tuo packages.json principale che eseguisse i passaggi per la risposta principale, quindi qualcosa del tipo "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"per garantire che il pacchetto che causa problemi venga creato prima che l'applicazione venga eseguita. Come detto, però, preferisco l'approccio del fork del repository al mio utente, aggiungendo il postinstall al pacchetto stesso e usandolo nella mia applicazione.
Mike B

Penso che l'aggiunta per la preparazione dovrebbe essere preferita (risposta di @ Simon), perché se si installa da npm, non sarebbe necessario eseguire alcuna compilazione aggiuntiva perché dovrebbe già includere un dist / dir. Vedere docs.npmjs.com/misc/scripts : "Prepara: esegui entrambi PRIMA che il pacchetto sia compresso e pubblicato, ... e durante l'installazione delle dipendenze git"
Tyler Rick

postinstallè a un passo dalla giusta soluzione. Basta usare prepare. È il 2020.
Cameron Tacklind

2

Usa semplicemente il comando npm install git+https://git@github.com/myRepo/angular-translate.git. Grazie.

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.