Cli: [BUG] `npm ci` tidak menjalankan skrip` postinstall`

Dibuat pada 6 Okt 2020  ·  8Komentar  ·  Sumber: npm/cli

Perilaku Saat Ini:

npm ci tidak menjalankan skrip postinstall

Perilaku yang Diharapkan:

npm ci harus menjalankan skrip postinstall

Langkah-langkah untuk Mereproduksi:

  1. buat folder baru dan masukkan minimal package.json berikut di dalamnya:
{
  "scripts": {
    "postinstall": "echo \"it should echo this\""
  }
}


  1. jalankan npm install
  2. jalankan npm ci
  3. perhatikan bagaimana npm ci TIDAK menjalankan skrip postinstall

Lingkungan Hidup:

ex.

  • OS: Kubuntu 20.04
  • Node: 14.13.0
  • npm: 7.0.0-rc.0
Bug Release 7.x

Komentar yang paling membantu

@darcyclarke @isaacs mohon maaf atas tag langsung tersebut, tetapi saya melihat bahwa masalah ini telah dihapus dari salah satu pencapaian sprint, jadi saya ingin memastikan bahwa ini tidak terlewatkan karena ini adalah regresi yang cukup besar.

Ini repro minimal, jika tidak jelas dari masalah aslinya:

{
  "scripts": {
    "prepare": "echo foo"
  }
}

Dengan npm@6 , npm install dan npm ci print "foo". Dengan npm@7 , npm install mencetak "foo" tetapi npm ci tidak.

Masalahnya adalah bahwa perintah instal memiliki blok berikut untuk secara eksplisit menjalankan skrip instalasi yang sesuai, tetapi perintah ci tidak memiliki blok seperti itu:

https://github.com/npm/cli/blob/a28aff769a77f127f371c31afcb9e9814722e5cd/lib/install.js#L44 -L62

Semua 8 komentar

Saya pikir ini berfungsi sebagaimana mestinya atau setidaknya sama dengan npm v6 & tidak terlihat seperti bug tetapi mungkin sangat membingungkan.

Skrip preinstall , install & postinstall sebenarnya adalah peristiwa siklus hidup yang dipicu saat paket itu sendiri sedang diinstal ke dalam proyek lain atau sebagai ketergantungan. Karena itu, Anda dapat memicu skrip ini secara manual menggunakan npm run .

Jika Anda ingin mengeksekusi beberapa kode setiap kali Anda menjalankan install pada level proyek, saya rasa Anda akan ingin menggunakan hook scripts (yaitu mendefinisikan sebuah executable dengan nama yang sama dengan acara di ./node_modules/.hooks/ ).

Jelas beri tahu saya jika saya salah & bahwa ini / sedang bekerja pada versi CLI sebelumnya. Pilihan lain di sini adalah hanya untuk merantai (mis. npm install x && npm run y , atau kami memiliki perintah praktis seperti install-test & install-ci-test yang melakukan npm install lalu npm run test yang merupakan alur kerja umum untuk orang-orang)

Ini bukan cara kerja npm 6.

npm 6:

image

npm 7:

image

Hmm, melihat ini lebih dalam, saya tahu bahwa kami memang ingin menghentikan pemasangan & kami menerapkan RFC untuk itu (ref. Https://github.com/npm/rfcs/blob/latest/implemented/0022- quieter-install-scripts.md); Tapi kita harus tetap menjalankannya. Saya akan mengajukan ini & melihat apakah kita bisa meminta seseorang untuk menggali lebih dalam.

Saya bisa mendukung ini. Saya memiliki proyek menggunakan Husky . Saat melakukan instalasi baru, Husky tidak berjalan, juga tidak menginstal git hooks. Ini diubah dari NPM v6 menjadi NPM v7. Satu hal yang sedikit berbeda dari masalah OP, adalah bahwa (saya yakin) skrip postinstall yang dijalankan ada di modul Husky, dan bukan di skrip root project.

Contoh npm ci snippet untuk Husky:

$ npm ci
npm WARN prepare removing existing node_modules/ before installation

> [email protected] install ./atlas-server/node_modules/husky
> node husky install

husky > Setting up git hooks
husky > Done

> [email protected] postinstall ./atlas-server/node_modules/husky
> opencollective-postinstall || exit 0

Thank you for using husky!
If you rely on this package, please consider supporting our open collective:
> https://opencollective.com/husky/donate

...

Saya menggunakan lerna dan menggunakan postinstall pada proyek saya seperti di bawah ini.

  "scripts": {
    "postinstall": "lerna bootstrap",

https://github.com/mobilusoss/textlint-browser-runner/blob/master/package.json#L18

postinstall dipanggil setelah npm ci di TravisCI dengan npm v 6.14.8
https://travis-ci.com/github/mobilusoss/textlint-browser-runner/builds/191070080

Tetapi npm v7.0.3 tidak memanggil postinstall
https://travis-ci.com/github/mobilusoss/textlint-browser-runner/jobs/403527216

Solusi saya adalah memanggil lerna bootstrap secara manual setelah npm ci

Konfirmasi. Melanggar perubahan sejak npm 7.0.0

Mungkin disebabkan oleh

Perintah yang hanya menjalankan satu skrip (uji npm, npm start, npm stop, dan npm restart) sekarang akan menjalankan skripnya bahkan jika --ignore-scripts disetel. Sebelum rilis GA v7.0.0, mereka tidak akan menjalankan skrip pra / posting, namun. (Jadi, dimungkinkan untuk menjalankan npm test --ignore-scripts untuk menjalankan pengujian Anda tetapi tidak linter Anda, misalnya.)

Apakah ini akan dianggap sebagai bug atau sebagai perubahan yang mengganggu untuk npm 7?

@darcyclarke @isaacs mohon maaf atas tag langsung tersebut, tetapi saya melihat bahwa masalah ini telah dihapus dari salah satu pencapaian sprint, jadi saya ingin memastikan bahwa ini tidak terlewatkan karena ini adalah regresi yang cukup besar.

Ini repro minimal, jika tidak jelas dari masalah aslinya:

{
  "scripts": {
    "prepare": "echo foo"
  }
}

Dengan npm@6 , npm install dan npm ci print "foo". Dengan npm@7 , npm install mencetak "foo" tetapi npm ci tidak.

Masalahnya adalah bahwa perintah instal memiliki blok berikut untuk secara eksplisit menjalankan skrip instalasi yang sesuai, tetapi perintah ci tidak memiliki blok seperti itu:

https://github.com/npm/cli/blob/a28aff769a77f127f371c31afcb9e9814722e5cd/lib/install.js#L44 -L62

Apakah halaman ini membantu?
0 / 5 - 0 peringkat