npm zainstaluj i skompiluj rozwidlone repozytorium github

126

To nie jest zupełnie nowe pytanie, ale rozglądam się już od dłuższego czasu i mam problem ze znalezieniem rozwiązania.

Używam modułu dla mojej aplikacji kątowej o nazwie angular-translate. Jednak musiałem wprowadzić kilka drobnych modyfikacji w kodzie źródłowym, aby wszystko działało tak, jak bym chciał, a teraz chcę zachować te zmiany npm install. Kolega zasugerował, żebym rozwidlił repozytorium kodu źródłowego i wskazał na moje forked repo jako zależność, którą próbowałem w ten sposób, np

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

Pierwsza daje mi taki katalog bez kompilacji. Tylko plik package.json, .npmignore i kilka plików przecen

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

Drugi npm installdaje mi pełne repozytorium, ale znowu nie dostaję kompilacji, jak wtedy, gdy używam polecenia npm install angular-translate. Widziałem dyskusję dotyczącą uruchomienia wstępnie opublikowanego skryptu, ale nie jestem pewien, jak to zrobić podczas instalowania wszystkich modułów. Próbowałem też opublikować rozwidlenie jako własny moduł w rejestrze npm, ale znowu nie otrzymuję kompilacji i nie jestem pewien, czy to jest właściwe rozwiązanie ...

Przepraszam za swoją nieznajomość w temacie. Nie mam dużego doświadczenia z npm. Chciałbym otrzymać opinię na ten temat. Wygląda na to, że może to być dość powszechny problem, gdy trzeba wprowadzić modyfikacje w kodzie źródłowym pakietu? Może jest lepsze rozwiązanie? Z góry dziękuje za twoją pomoc.

hughesjmh
źródło

Odpowiedzi:

141

Spróbuj npm install <ghusername>/<repoName>, gdzie <ghUsername>jest twoja nazwa użytkownika GitHub (bez @) i <repoName>jest to nazwa repozytorium. To powinno poprawnie go zainstalować. Najprawdopodobniej będziesz chciał użyć flagi --savelub --save-devz poleceniem instalacji, aby zapisać zależność w pliku package.json.

Jeśli to nie działa poprawnie, sprawdź zawartość .npmignorepliku.

Nie panikuj, jeśli polecenie instalacji zajmuje dużo czasu; instalacja z repozytorium git jest wolniejsza niż instalacja z rejestru npm.


Edytować:

Twoim problemem jest to, że w Twoim przypadku dist/nie jest on zaangażowany w repozytorium (ponieważ jest w .gitignore). Tam właśnie żyje rzeczywisty kod. dist/jest budowany z plików w src/przed opublikowaniem pakietu w rejestrze npm, ale dist/nigdy nie jest zatwierdzany w repozytorium.

To brzydkie, ale w tym przypadku będziesz musiał usunąć dist/z, .gitignorea następnie uruchomić:

npm run build
git add .
git commit
git push

(Upewnij się, że biegałeś jako npm installpierwszy)

Wtedy powinieneś móc zainstalować z github.

Może istnieć inny sposób na zrobienie tego za pomocą postinstallskryptu, ale nie jestem pewien, czy to możliwe; Nigdy tego nie próbowałem.

RyanZim
źródło
2
Tak, to było prawie rozwiązanie. Musiałem także przeprowadzić instalację npm i trochę zmodyfikować GruntFile, ale to działało. Dzięki za pomoc :)
hughesjmh 10-16
2
Czy naprawdę nie ma innego sposobu na zrobienie czegoś innego niż unignore dist? Chcę zrobić PR do oryginalnego repozytorium, ale z dist, czy mu się to nie spodoba?
Ka Mok
7
@KaMok myślę, innym rozwiązaniem jest, w package.jsonpliku z widelcem, na podstawie scripts, zmiana nazwy prepublishna prepare. Wydaje się, że kiedy npm installlub npm install github:user_name/fork_name --save(i to samo dla przędzy) jest wykonywane, uruchamia również to, co jest w prepareskrypcie. Zakłada się, że prepublishskrypt tego pakietu tworzy pliki kompilacji, co zwykle ma miejsce.
davidfrancisco
5
a jeśli potrzebujesz konkretnej gałęzi,npm install <ghusername>/<repoName>#branchName
DrMeers
2
@RyanZim Nie masz racji. Instalacja z gita działa bardzo dobrze, o ile jest poprawnie skonfigurowana. docs.npmjs.com/cli/install "Jeśli instalowany pakiet zawiera prepareskrypt, jego dependenciesi devDependencieszostanie zainstalowany, a skrypt przygotowawczy zostanie uruchomiony, zanim pakiet zostanie spakowany i zainstalowany."
Cameron Tacklind,
15

Aktualizacja dla osób używających npm 5:

Od npm @ 5 prepublishskrypty są przestarzałe.

Służy preparedo wykonywania kroków kompilacji i tylko prepublishOnlydo przesyłania.

Odkryłem, że dodanie a "prepare": "npm run build"do skryptów rozwiązało wszystkie moje problemy.

Szymon
źródło
Dla mnie też to zadziałało (w widelcu, który właśnie zrobiłem) - dzięki! Zastanawiam się ... dlaczego wszystkie pakiety nie zawierają domyślnie tej konfiguracji skryptu? Czy to dlatego, że autorzy pakietów biorą pod uwagę tylko przypadek użycia instalacji swojego pakietu z npm, a nie przypadek instalacji go z repozytorium git? Więc są po prostu przyzwyczajeni do ręcznego uruchamiania npm run buildi npm run publishnie napotykają żadnych problemów ani bólu, chyba że pewnego dnia spróbują zainstalować repozytorium przez git?
Tyler Rick
9

Kod opublikowany w witrynie npmjs.com często nie znajduje się w repozytorium pakietu. Często „kompiluje się” pliki źródłowe JavaScript do wersji przeznaczonych do ogólnego użytku w bibliotekach. To jest zwykle publikowane na npmjs.com.

Jest to tak powszechne, że jest to funkcja npmautomatycznego uruchamiania kroku „budowania” przed publikacją ( npm publish). To było pierwotnie nazwane prepublish. Wygląda na to, że Npm pomyślał, że przydatne byłoby również uruchomienie prepublishskryptu nanpm install ponieważ był to standardowy sposób inicjowania środowiska programistycznego.

Doprowadziło to do poważnego zamieszania w społeczności. Na githubie są bardzo długie problemy na ten temat.

W końcu, starając się nie zmieniać starego zachowania, postanowili dodać dwa kolejne automatyczne skrypty: prepublishOnlyi prepare.

prepublishOnlyrobi to, czego oczekujesz. Nie działanpm install . Wielu opiekunów pakietów po prostu na ślepo przeszło na to.

Ale był też problem polegający na tym, że ludzie nie chcieli polegać na npmjs.com w zakresie dystrybucji wersji pakietów. Naturalnym wyborem były repozytoria Git. Jednak powszechną praktyką jest nie wysyłanie „skompilowanych” plików do git. Właśnie to preparezostało dodane do obsługi ...

prepare jest właściwą drogą

Jeśli masz repozytorium z plikami źródłowymi, ale do jego użycia potrzebny jest krok "budowania",
preparerobi dokładnie to, co chcesz we wszystkich przypadkach (od npm 4).

prepare: Uruchom oba, ZANIM pakiet zostanie spakowany i opublikowany, lokalnie npm install bez żadnych argumentów i podczas instalowania zależności git.

Możesz nawet umieścić swoje zależności kompilacji w devDependencies a zostaną one zainstalowane wcześniejprepare wykonaniem.

Oto przykład mojego pakietu, który używa tej metody.


Problemy z .gitignore

Jest jeden problem z tą opcją, który dotyka wiele osób. Podczas przygotowywania zależności Npm i Yarn zachowają tylko pliki wymienione w filessekcji package.json.

Można zobaczyć, że filesdomyślnie wszystkie dołączane pliki są gotowe. Łatwo przeoczyć to, że w .npmignore większości zastępuje filesdyrektywę, a jeśli .npmignorenie istnieje, .gitignorejest używana zamiast niej.

Tak więc, jeśli masz swoje wbudowane pliki wymienione na liście .gitignorejak rozsądna osoba i nie robisz nic więcej, preparebędzie wydawać się zepsute

Jeśli naprawisz, filesaby uwzględnić tylko skompilowane pliki lub dodać puste .npmignore, wszystko jest gotowe.

Moim zaleceniem jest ustawienie files(lub odwrócenie .npmignore) takiego ustawienia, aby jedynymi faktycznie publikowanymi plikami były te, które są potrzebne użytkownikom opublikowanego pakietu. Imho, nie ma potrzeby dołączania nieskompilowanych źródeł do publikowanych pakietów.


Oryginalna odpowiedź: https://stackoverflow.com/a/57503862/4612476

Cameron Tacklind
źródło
1
PREPARE działało dla mnie zamiast POSTINSTALL.i po prostu uruchomiłem npm uruchom kompilację w przygotowaniu.
Milind
6

Aby skorzystać z doskonałej odpowiedzi @ RyanZim, postinstall jest zdecydowanie odpowiednią opcją.

Wykonaj jedną z następujących czynności:

  1. Zaktualizuj plik package.json w swoim rozwidlonym repozytorium, aby dodać element postinstall do skryptów. Tutaj uruchom wszystko, czego potrzebujesz, aby uzyskać skompilowane dane wyjściowe (preferowane).
  2. Zaktualizuj plik package.json i dodaj plik postinstall, który aktualizuje niezbędny katalog w node_modules.

Jeśli rozwidliłeś repozytorium innych osób, warto poruszyć problem, aby zilustrować problem polegający na tym, że instalacja ich pakietu przez GitHub nie działa, ponieważ nie zapewnia niezbędnych środków do zbudowania skryptu. Następnie mogą zaakceptować żądanie PR, aby rozwiązać ten problem za pomocą postinstalacji, lub mogą je odrzucić i możesz zrobić nr 2.

Mike B.
źródło
Czy możesz wyjaśnić lub skorzystać z zasobów, jak wykonać punkt 2? Jakie polecenia muszę uruchomić po instalacji npm, gdy gitrepo zawiera tylko src nie dist
Daniel
1
@Daniel Przepraszamy, próbuję przypomnieć sobie kontekst, w którym robiłem to w przeszłości. Myślę, że przez # 2 zamierzałem dodać krok poinstalacyjny do twojego głównego packages.json, który uruchomiłby kroki dla pierwszej odpowiedzi, więc coś w rodzaju, "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"aby upewnić się, że pakiet powodujący problemy zostanie zbudowany przed uruchomieniem aplikacji. Jak już powiedziano, wolę jednak podejście polegające na rozwidlaniu repozytorium do własnego użytkownika, dodaniu postinstall do samego pakietu i użyciu go w mojej aplikacji.
Mike B
Myślę, że dodanie do przygotowania powinno być preferowane (odpowiedź @ Simona), ponieważ jeśli instalujesz z npm, nie musisz robić żadnego dodatkowego budowania, ponieważ powinien już zawierać dist / dir. Zobacz docs.npmjs.com/misc/scripts : "przygotuj: uruchom oba, ZANIM pakiet zostanie spakowany i opublikowany, ... i podczas instalowania zależności git"
Tyler Rick
postinstallbrakuje o jeden krok do właściwego rozwiązania. Po prostu użyj prepare. Jest rok 2020.
Cameron Tacklind