Proje: Okul Platform · Hub: Okul Platform — Incidents

Semptom

npm run prod GitHub Actions Linux runner’da üst üste başarısız oldu:

[webpack-cli] Error: Cannot find module '@tailwindcss/oxide-linux-x64-gnu'
[webpack-cli] Error: Cannot find module '../lightningcss.linux-x64-gnu.node'

Lokal macOS’ta (darwin-arm64) build sorunsuz.

Root cause

Üç katmanlı bir problem:

  1. npm cli#4828 optional-deps bug@tailwindcss/oxide ve lightningcss platform-özel native binding’lerini optionalDependencies üzerinden yayımlıyor (her platform için ayrı paket: -darwin-arm64, -linux-x64-gnu, vb.). macOS’ta oluşturulan package-lock.json sadece host platformun binding’ini tam node_modules entry’si olarak kaydediyor; Linux binding listede var ama tam tree entry yok.
  2. npm ci lockfile’ı birebir izliyor — eksik tree entry’li platform binding’ini “kur” diye yorumlamıyor, geçiyor.
  3. Node 18 EBADENGINE@tailwindcss/oxide@4.2.2 Node ≥20 istiyor. Node 18’de npm optional-deps’i sessizce atlıyor.

Çözüm (.github/workflows/build-assets.yml)

  • node-version: '18''20'
  • npm ci sonrası platform binding’lerini explicit install et (lockfile’a dokunmadan):
    run: |
      npm ci
      npm install --no-save --no-audit --no-fund \
        @tailwindcss/oxide-linux-x64-gnu \
        lightningcss-linux-x64-gnu

Denenen ve reddedilen yaklaşımlar

  • rm package-lock.json && npm install — Linux’ta taze resolve ediyor ama fresh tree farklı transitive dep versiyonları üretiyor, customer workspace gulp build:static ENOENT ile patladı (gulp-stream empty-glob davranışı değişti).
  • Lockfile’ı macOS’ta regenerate et — aynı npm bug tekrar tetikleniyor, Linux binding’i yine node_modules tree’de eksik kalıyor.

Kalıcı ders

Tailwind v4 + Linux CI kombinasyonu için lockfile’ı author-platform’da bırak + explicit platform binding install’u en stabil yol. npm ci determinizmini korur, customer workspace’i kırmaz.