npm instal dan bangun repo github bercabang

126

Ini bukanlah pertanyaan yang sama sekali baru, tetapi saya telah mencari-cari cukup lama sekarang dan saya mengalami masalah dalam menemukan solusi.

Saya menggunakan modul untuk aplikasi sudut saya yang disebut angular-translate. Namun, saya harus membuat beberapa modifikasi kecil pada kode sumber agar semuanya bekerja seperti yang saya inginkan, dan sekarang saya ingin mempertahankan perubahan tersebut npm install. Seorang kolega menyarankan agar saya membagi repo kode sumber dan menunjuk ke repo bercabang saya sebagai ketergantungan, yang telah saya coba dengan cara ini, mis.

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

Yang pertama memberi saya direktori seperti ini tanpa build. Hanya package.json, .npmignore, dan beberapa file penurunan harga

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

Yang kedua npm installmemberi saya repo penuh, tetapi sekali lagi saya tidak mendapatkan build seperti ketika saya menggunakan perintah npm install angular-translate. Saya telah melihat beberapa diskusi tentang menjalankan skrip prapublikasi, tetapi saya tidak yakin bagaimana melakukan ini saat menginstal semua modul. Saya juga mencoba menerbitkan fork sebagai modul saya sendiri ke registri npm, tetapi sekali lagi saya tidak mendapatkan build, dan saya tidak yakin itu hal yang benar untuk dilakukan ...

Saya minta maaf atas ketidaktahuan saya tentang topik ini. Saya tidak memiliki banyak pengalaman dengan npm. Ingin mendapatkan masukan tentang masalah ini. Sepertinya ini bisa menjadi masalah yang cukup umum ketika modifikasi perlu dilakukan pada kode sumber paket? Mungkin ada solusi yang lebih baik? Terima kasih sebelumnya atas bantuan Anda.

hughesjmh
sumber

Jawaban:

141

Coba npm install <ghusername>/<repoName>, di mana <ghUsername>nama pengguna GitHub Anda (tanpa @) dan <repoName>adalah nama repositori. Itu harus menginstalnya dengan benar. Kemungkinan besar Anda ingin menggunakan flag --saveatau --save-devdengan perintah install untuk menyimpan dependensi di file package.json.

Jika tidak berfungsi dengan benar, periksa konten .npmignorefile Anda .

Jangan panik jika perintah instal membutuhkan waktu lama; menginstal dari repositori git lebih lambat daripada menginstal dari registri npm.


Edit:

Masalah Anda adalah bahwa dalam kasus Anda, dist/tidak berkomitmen untuk repo (karena ada di .gitignore). Di situlah kode sebenarnya berada. dist/dibangun dari file src/sebelum paket dipublikasikan ke registri npm, tetapi dist/tidak pernah dikomit ke repo.

Ini jelek, tetapi dalam hal ini Anda harus menghapus dist/dari .gitignoredan kemudian menjalankan:

npm run build
git add .
git commit
git push

(Pastikan Anda sudah lari npm installdulu)

Anda kemudian harus dapat menginstal dari github.

Mungkin ada cara lain untuk melakukan ini menggunakan postinstallskrip, tetapi saya tidak yakin apakah itu mungkin; Saya belum pernah mencobanya.

RyanZim
sumber
2
Ya, itu adalah solusinya. Juga harus melakukan instalasi npm dan sedikit memodifikasi GruntFile, tetapi itu membuatnya berfungsi. Terima kasih atas bantuan Anda :)
hughesjmh
2
Apakah benar-benar tidak ada cara lain untuk dilakukan selain unignore dist? Saya ingin membuat PR ke repo asli, tetapi dengan dist, apakah dia tidak akan menyukainya?
Ka Mok
7
@KaMok Saya pikir opsi lain adalah, dalam package.jsonfile garpu Anda, di bawah scripts, ganti nama prepublishmenjadi prepare. Tampaknya ketika npm installatau npm install github:user_name/fork_name --save(dan sama untuk benang) dijalankan itu juga menjalankan apa yang ada di prepareskrip. Ini mengasumsikan prepublishskrip paket ini membuat file build, yang biasanya terjadi.
davidfrancisco
5
dan jika Anda membutuhkan cabang tertentu,npm install <ghusername>/<repoName>#branchName
DrMeers
2
@RyanZim Anda salah. Penginstalan dari git bekerja dengan sangat baik asalkan diatur dengan benar. docs.npmjs.com/cli/install "Jika paket yang diinstal berisi prepareskrip, itu dependenciesdan devDependenciesakan diinstal, dan skrip persiapan akan dijalankan, sebelum paket dikemas dan diinstal."
Cameron Tacklind
15

Pembaruan untuk mereka yang menggunakan npm 5:

Mulai npm @ 5, prepublishskrip sudah tidak digunakan lagi.

Gunakan prepareuntuk langkah-langkah pembuatan dan prepublishOnlyuntuk upload-saja.

Saya menemukan menambahkan a "prepare": "npm run build"ke skrip memperbaiki semua masalah saya.

Simon
sumber
Itu juga berhasil untuk saya (di garpu yang baru saja saya buat) - terima kasih! Saya bertanya-tanya ... mengapa tidak semua paket menyertakan konfigurasi skrip ini secara default? Apakah karena pembuat paket hanya mempertimbangkan kasus penggunaan menginstal paket mereka dari npm dan bukan kasus menginstalnya dari git repo? Jadi mereka hanya terbiasa menjalankan secara manual npm run builddan npm run publishdan tidak mengalami masalah atau rasa sakit apa pun kecuali suatu hari mereka mencoba menginstal repo melalui git?
Tyler Rick
9

Kode yang diterbitkan ke npmjs.com seringkali bukan yang ada di repositori untuk paket. "Mengompilasi" file sumber JavaScript ke dalam versi yang dimaksudkan untuk konsumsi umum di perpustakaan adalah hal yang umum. Itulah yang biasanya dipublikasikan ke npmjs.com.

Sangat umum bahwa ini adalah fitur npmuntuk secara otomatis menjalankan langkah "build" sebelum menerbitkan ( npm publish). Ini awalnya disebut prepublish. Tampaknya Npm berpikir akan berguna juga untuk menjalankan prepublishskrip pada npm installkarena itu adalah cara standar untuk menginisialisasi lingkungan pengembangan.

Hal ini akhirnya menimbulkan kebingungan besar di komunitas. Ada masalah yang sangat panjang di github tentang ini.

Pada akhirnya, dalam upaya untuk tidak mengubah perilaku lama, mereka memutuskan untuk menambahkan dua skrip otomatis lagi: prepublishOnlydan prepare.

prepublishOnlymelakukan apa yang Anda harapkan. Itu tidak berjalan npm install. Banyak pengelola paket yang secara membabi buta beralih ke ini.

Tetapi ada juga masalah ini dimana orang ingin tidak bergantung pada npmjs.com untuk mendistribusikan versi paket. Repositori Git adalah pilihan yang wajar. Namun, praktik umum untuk tidak memasukkan file "yang dikompilasi" ke git. Itulah yang prepareditambahkan untuk menangani ...

prepare adalah cara yang benar

Jika Anda memiliki repositori dengan file sumber tetapi langkah "build" diperlukan untuk menggunakannya,
preparelakukan persis apa yang Anda inginkan dalam semua kasus (mulai npm 4).

prepare: Jalankan keduanya SEBELUM paket dikemas dan dipublikasikan, di lokal npm installtanpa argumen apa pun, dan saat menginstal dependensi git.

Anda bahkan dapat memasukkan dependensi build Anda ke dalamnya devDependenciesdan dependensi tersebut akan diinstal sebelum preparedieksekusi.

Berikut adalah contoh paket saya yang menggunakan metode ini.


Masalah dengan .gitignore

Ada satu masalah dengan opsi ini yang membuat banyak orang tertarik. Saat menyiapkan dependensi, Npm dan Yarn hanya akan menyimpan file yang terdaftar di filesbagian package.json.

Orang mungkin melihat bahwa filesdefault untuk semua file disertakan dan mengira sudah selesai. Apa yang mudah terlewatkan adalah .npmignore sebagian besar mengesampingkan filesarahan dan , jika .npmignoretidak ada, .gitignoredigunakan sebagai gantinya.

Jadi, jika Anda memiliki file bawaan yang terdaftar .gitignoreseperti orang waras, dan tidak melakukan hal lain, prepareakan tampak rusak

Jika Anda memperbaiki filesuntuk hanya menyertakan file yang dibangun atau menambahkan yang kosong .npmignore, Anda sudah siap.

Rekomendasi saya adalah untuk mengatur files(atau, dengan inversi, .npmignore) sehingga satu-satunya file yang benar-benar diterbitkan adalah yang dibutuhkan oleh pengguna paket yang diterbitkan. Imho, tidak perlu menyertakan sumber yang tidak dikompilasi dalam paket yang diterbitkan.


Jawaban asli: https://stackoverflow.com/a/57503862/4612476

Cameron Tacklind
sumber
1
SIAPKAN bekerja untuk saya alih-alih POSTINSTALL. Saya hanya menjalankan npm run build in prepared.
Milind
6

Untuk mendukung jawaban @ RyanZim yang luar biasa, postinstalljelas merupakan pilihan yang valid untuk ini.

Lakukan salah satu dari yang berikut:

  1. Perbarui package.json di repo bercabang Anda untuk menambahkan elemen postinstall ke skrip. Di sini, jalankan apa pun yang Anda butuhkan untuk mendapatkan output terkompilasi (Lebih disukai).
  2. Perbarui package.json Anda, dan tambahkan postinstall yang memperbarui direktori yang diperlukan di node_modules.

Jika Anda telah mem-fork repositori orang lain, mungkin ada baiknya mengangkat masalah untuk mengilustrasikan masalah bahwa menginstal paket mereka melalui GitHub tidak berfungsi karena tidak menyediakan sarana yang diperlukan untuk membangun skrip. Dari sana, mereka dapat menerima PR untuk menyelesaikan masalah ini dengan pasca instalasi, atau mereka dapat menolaknya dan Anda dapat melakukan # 2.

Mike B
sumber
Dapatkah Anda menjelaskan atau memiliki sumber daya tentang cara melakukan # 2? Perintah mana yang saya perlukan untuk menjalankan setelah npm install ketika gitrepo hanya berisi src bukan dist
Daniel
1
@Daniel Apologies, saya mencoba mengingat konteks di mana saya melakukan ini di masa lalu. Saya pikir dengan # 2 saya bermaksud menambahkan langkah postinstall ke package.json utama Anda yang akan menjalankan langkah-langkah untuk jawaban teratas, jadi sesuatu di sepanjang baris "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"untuk memastikan bahwa paket yang menyebabkan masalah Anda dibangun sebelum aplikasi Anda berjalan. Seperti yang dikatakan, saya lebih suka pendekatan forking repo ke pengguna saya sendiri, menambahkan postinstall ke paket itu sendiri, dan menggunakannya di aplikasi saya.
Mike B
Saya pikir menambahkan untuk mempersiapkan harus lebih disukai (jawaban @ Simon), karena jika menginstal dari npm, Anda tidak perlu melakukan bangunan tambahan karena seharusnya sudah menyertakan dist / dir. Lihat docs.npmjs.com/misc/scripts : "persiapkan: Jalankan keduanya SEBELUM paket dikemas dan dipublikasikan, ... dan saat menginstal dependensi git"
Tyler Rick
postinstalladalah satu langkah pendek dari solusi yang tepat. Gunakan saja prepare. Ini tahun 2020.
Cameron Tacklind
2

Cukup gunakan perintah npm install git+https://[email protected]/myRepo/angular-translate.git. Terima kasih.

Bimal Jha
sumber