Yarn: Menambahkan ketergantungan baru tidak menghormati batasan versi yang ada dalam resolusi

Dibuat pada 11 Okt 2017  ·  4Komentar  ·  Sumber: yarnpkg/yarn

Apakah Anda ingin meminta fitur atau melaporkan bug ?
Bug.

Bagaimana perilaku saat ini?
Yarn tidak menghormati kunci versi yang sudah ditambahkan saat menyelesaikan dependensi dari dependensi yang baru ditambahkan.

Jika perilaku saat ini adalah bug, berikan langkah-langkah untuk mereproduksi.

  1. Di dalam modul kosong
  2. Tambahkan reaksi 15.6.1 yarn add [email protected]
  3. Tambahkan [email protected] yarn add [email protected]
  4. Bug mereproduksi dan dua versi berbeda bereaksi diinstal:
$ yarn list react
yarn list v1.1.0
├─ [email protected]
└─ [email protected]
   └─ [email protected]
✨  Done in 0.24s.

Apa perilaku yang diharapkan?
Diharapkan hanya [email protected] yang diinstal karena itu dapat memenuhi semua batasan versi. Inilah yang terjadi jika saya menghapus yarn.lock setelah kedua dependensi ada di package.json dan yarn install ie

$ rm -rf node_modules/ yarn.lock && yarn install && yarn list react
yarn list v1.1.0
└─ [email protected]
✨  Done in 0.17s.

Sebutkan node.js, benang, dan versi sistem operasi Anda.

$ node --version
v6.9.4
$ yarn --version
1.2.0
$ system_profiler SPSoftwareDataType|grep "System Version"
      System Version: macOS 10.12.6 (16G29)

EDIT: Repro asli dilakukan dengan benang v.1.1.0, tetapi saya meningkatkan ke 1.2.0 dan ini masih mereproduksi.

cat-bug high-priority triaged

Komentar yang paling membantu

Akan memeriksa hari ini 👍

Semua 4 komentar

Saya sedang menggali ini ...

Memperhatikan bahwa parameter yang diteruskan ke PackageResolver.getHighestRangeVersionMatch(name, range, manifest) mungkin salah. Kelulusan range tampaknya menjadi versi tunggal terselesaikan sebenarnya ( 15.6.2 ) dan bukan kisaran yang diminta ( ^15.5.4 ).

Itu pada gilirannya membangun ke baris di mana ia memeriksa untuk melihat apakah ada versi yang terinstal saat ini cocok dengan kisaran semver: semver.maxSatisfying(["15.6.1"], '15.6.2'); // null Jika kisaran yang benar telah dilewati, maka itu akan dieksekusi semver.maxSatisfying(["15.6.1"], '^15.5.4'); // 15.6.1 yang seharusnya selesaikan masalah ini.

Saya akan terus menelusuri kode ...

Oke, sepertinya ini diperkenalkan oleh # 3729 khususnya baris di package-request.js :

const solvedRange = semver.validRange(range) ? info.version : range;

Jadi jika range ( ^15.5.4 ) valid, maka kita menggunakan info.version sebagai gantinya ( 15.6.2 ).
Itu diturunkan untuk melihat apakah ada versi yang diinstal cocok dengan 15.6.2 :

const maxValidRange = semver.maxSatisfying(['15.6.1'], '15.6.2'); // null

@arcanis sepertinya PR yang ditautkan itu milik Anda. Saya ragu-ragu untuk mengubah apa pun dan mengambil risiko membuka kembali apa pun yang diperbaiki PR itu. Bisakah Anda membantu?

Akan memeriksa hari ini 👍

Sooo, ayo coba perbaiki itu! Saya tidak suka bahwa paket mengandalkan pengangkatan (tandai kata-kata saya - bahkan jika kita memperbaikinya, mereka akan rusak lagi di masa mendatang), tetapi kita membuatnya kurang efisien daripada yang seharusnya juga tidak bagus. Memposting ulang apa yang saya pakai # 5561:

Saya tidak begitu memahami logika di atas. jika range adalah semver yang valid maka jangan menggunakannya?

Anda benar, itu tidak masuk akal: / Saya pikir apa yang ingin saya lakukan adalah "jika ini bukan versi tetapi merupakan rentang, maka gunakan yang sudah kami miliki jika memungkinkan" (karena tujuan PR tidak melakukan optimasi saat membaca dari lockfile). Dengan demikian, kondisinya mungkin harus:

const solvedRange = semver.valid(range) && !semver.validRange(range) ? range : info.version;
Apakah halaman ini membantu?
0 / 5 - 0 peringkat