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 install
daje 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.
źródło
package.json
pliku z widelcem, na podstawiescripts
, zmiana nazwyprepublish
naprepare
. Wydaje się, że kiedynpm install
lubnpm install github:user_name/fork_name --save
(i to samo dla przędzy) jest wykonywane, uruchamia również to, co jest wprepare
skrypcie. Zakłada się, żeprepublish
skrypt tego pakietu tworzy pliki kompilacji, co zwykle ma miejsce.npm install <ghusername>/<repoName>#branchName
prepare
skrypt, jegodependencies
idevDependencies
zostanie zainstalowany, a skrypt przygotowawczy zostanie uruchomiony, zanim pakiet zostanie spakowany i zainstalowany."Aktualizacja dla osób używających npm 5:
Odkryłem, że dodanie a
"prepare": "npm run build"
do skryptów rozwiązało wszystkie moje problemy.źródło
npm run build
inpm run publish
nie napotykają żadnych problemów ani bólu, chyba że pewnego dnia spróbują zainstalować repozytorium przez git?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
npm
automatycznego uruchamiania kroku „budowania” przed publikacją (npm publish
). To było pierwotnie nazwaneprepublish
. Wygląda na to, że Npm pomyślał, że przydatne byłoby również uruchomienieprepublish
skryptu 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:
prepublishOnly
iprepare
.prepublishOnly
robi 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
prepare
został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",
prepare
robi dokładnie to, co chcesz we wszystkich przypadkach (od npm 4).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
files
sekcjipackage.json
.Można zobaczyć, że
files
domyślnie wszystkie dołączane pliki są gotowe. Łatwo przeoczyć to, że w.npmignore
większości zastępujefiles
dyrektywę, a jeśli.npmignore
nie istnieje,.gitignore
jest używana zamiast niej.Tak więc, jeśli masz swoje wbudowane pliki wymienione na liście
.gitignore
jak rozsądna osoba i nie robisz nic więcej,prepare
będzie wydawać się zepsuteJeśli naprawisz,
files
aby 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
źródło
Aby skorzystać z doskonałej odpowiedzi @ RyanZim,
postinstall
jest zdecydowanie odpowiednią opcją.Wykonaj jedną z następujących czynności:
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.
źródło
"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.postinstall
brakuje o jeden krok do właściwego rozwiązania. Po prostu użyjprepare
. Jest rok 2020.Po prostu użyj polecenia
npm install git+https://[email protected]/myRepo/angular-translate.git
. Dzięki.źródło