Jak edytować moduł węzła zainstalowany przez npm?

125

Używam modułu node_swiz, który z kolei używa modułu walidatora.

Chcę wprowadzić zmiany w module walidatora, ale użyłem instalacji npm do zainstalowania modułów / zależności.

Czy mogę po prostu wprowadzić zmiany w module walidatora wewnątrz node_modules, czy też zależności node_modules zostaną odtworzone i uzyskana najnowsza wersja, kiedy opublikuję w heroku lub następnym razem uruchomię npm install?

Struktura wygląda następująco:

myNodeApplication
  - node_modules
     - swiz
         - node_modules
            - validator [this is the library I want to edit]

Dzięki za pomoc!

user1810875
źródło

Odpowiedzi:

244

Możesz edytować plik bezpośrednio, ale zostanie on nadpisany za każdym razem, gdy aktualizacje npm, najlepiej jest przejść bezpośrednio do źródła.

Jeśli zmiany wpływają na funkcjonalność całego modułu i mogą być przydatne dla innych, możesz dołączyć do oryginalnego źródła na github i poszukać zmiany do zaimplementowania.

Jeśli jest to własna funkcjonalność, która jest potrzebna i nie pomogłaby w rozwoju modułu, najlepszą rzeczą do zrobienia jest rozwidlenie go z github i wprowadzenie zmian. Możesz instalować elementy bezpośrednio z github za pomocą NPM, a ta metoda pozwoli ci zintegrować przyszłe zmiany z twoją niestandardową wersją z oryginalnego źródła.

Aby zainstalować bezpośrednio z github, użyj następującego polecenia:

npm install https://github.com/<username>/<repository>/tarball/master

Sdedelbrock
źródło
2
Dzięki! Dokładnie to chciałem wiedzieć. Również dla innych, którzy to czytają ... Chciałem dołączyć moduł, który jest na moim githubie do pliku package.json, a informacje na ten temat są tutaj: stackoverflow.com/a/8306715/1810875
user1810875
22
przed rozwidleniem zmieniam go w systemie lokalnym, ale zmiana nie wydaje się mieć wpływu. Zmiana dowolnego pliku javascript, którym jest node_modules / nazwa_pakietu / lib / nazwa_pliku.js ma wpływ?
dociekliwy
1
Tylko uwaga, nie jestem pewien, czy coś się zmieniło, ale osobiście musiałem określić adres URL Gita jako git: //github.com/ <user> / <package> .git "
Craig
5
@JohnDevor Zamiast instalować dostosowany moduł, użyj polecenia „npm link”, aby po prostu utworzyć łącze symboliczne
Venryx
3
Rozgryzłem to, musiałem przejść do folderu /node_modulesi uruchomić, npm installa wszystko jest w porządku!
Adam Moisa
8

Możesz użyć pakietu poprawek, aby wprowadzić i utrwalić zmiany w modułach węzła.

Można to zrobić, najpierw wprowadzając zmiany w pakiecie wewnątrz, node_modulesa następnie uruchamiając następujące polecenie, które <package name>jest nazwą pakietu, w którym właśnie wprowadzono zmiany.

npx patch-package <package name>

patch-package utworzy patchesfolder z plikiem w środku, reprezentującym twoje zmiany. Ten plik można następnie przekazać do git, a łaty można przywrócić później, uruchamiając npx patch-package(bez żadnych argumentów).

Opcjonalny krok:

Dodaj poniższy fragment w sekcji skryptu pliku package.json, aby automatycznie załatać zależność podczas wykonywania polecenia „npm install”.

"postinstall": "npx patch-package" 
Pedro Fracassi
źródło
1
Bardzo fajne rozwiązanie, które sprawdziło się bez problemu.
ヨ ハ ン ソ ン
To jest naprawdę fajne! FYI: Musiałem użyć opcji „preinstall” zamiast „postinstall”, ponieważ moja poprawka dotyczyła skryptu poinstalacyjnego zależności. Jak byś to zaimplementował, gdybyś miał inne łatki, które trzeba było zastosować w fazie poinstalacyjnej?
Superole
1
Niesamowita odpowiedź. Musiałem wprowadzić modyfikacje w dep przed wdrożeniem do netlify. preinstall 'npx patch-package' był magicznym biletem. Właściwy obraz jest teraz wyświetlany na stronie internetowej.
TheBetterJORT
1

Nie chciałem publikować nowego modułu i nie chciałem npm installteż nadpisywać moich zmian. Znalazłem rozwiązanie obu tych problemów, ale prawdopodobnie lepiej byłoby skorzystać z rady @ Sdedelbrock. Ale jeśli chcesz to zrobić, oto jak:

  1. Edytuj package.jsonplik, aby usunąć zależność, którą chcesz edytować.
  2. Wejdź do swojego projektu /node_modulesi przenieś folder w inne miejsce w repozytorium, które można zatwierdzić. Więc teraz /node_modules/dependencyjest o/dependency
  3. cd do katalogu zależności i wpisz npm link
  4. cdw katalogu głównym projektu i wpisz npm link dependency Ważne jest, aby zrobić to poza /node_modulesi/dependency

Jeśli wszystko działało, powinieneś mieć teraz łącze symboliczne utworzone w programie /node_modules/dependency. Teraz możesz uruchomić swój projekt, aby sprawdzić, czy działa.

Daniel Kaplan
źródło