• ..

Jest

    yarn install 時にフック関数を実行しないようにする

    例えばpackage.jsonに以下のように書いてあったとします。

    "scripts": {
      "preinstall": "echo 1",
      "postinstall": "echo 2",
      "prepare": "echo 3",
    }

    そして、yarn(またはyarn install)すると、

    yarn
    # yarn install v1.12.3
    # $ echo 1
    # 1
    # [1/4] 🔍  Resolving packages...
    # success Already up-to-date.
    # $ echo 2
    # 2
    # $ echo 3
    # 3

    という感じで全部実行されます。ローカルマシンでは自分で叩くようにしていると忘れていたりするのでこの動作は助かります。(特にpublish前のprepare) ただprepareでビルド処理とかしていると実行時間がただのyarnに比べて3,4倍になってしまっている感じもします。僕の CI 環境は、無料実行時間カツカツな状態なので、フックしなくていいから少しでも早く終わらせたいです。

    --ignore-scripts

    もう一度ドキュメントを読みました。そうしたら、どうやらこのオプションを使うといけるようです。 このオプションを使うと上記と同じscriptsの設定で、

    yarn --ignore-scripts
    # yarn install v1.12.3
    # [1/4] 🔍  Resolving packages...
    # success Already up-to-date.
    # ✨  Done in 0.79s.

    だけのログになりフックされないようにすることができました。

    フックに依存しているパッケージを使っている時の注意

    nowを CircleCI 上で使おうとした所インストール時のフック処理がされずにおかしなことになりました。どうやらこのオプションは依存のフックも無効化してしまうようです。このような場合は、それ単体で再度インストールコマンドを実行して入れる感じで対応するといいと思います。

    resolutions で依存の依存のバージョンを指定する

    例えば自分はnode@^10を使っていて、これを使いたいのに直接的な依存ではないパッケージのpackage.jsonenginesnode@<1010より小さい)と指定されているが為にyarnでのインストールが失敗するということが起こる時があります。

    このエラーは一応yarn --ignore-enginesと、依存のenginesの指定を無視するオプションを付けると回避できますが、色んなプロジェクトを行き来していたりで「このプロジェクトではこのオプションが必要」などと覚えるのは面倒だったりするのでできれば解決したかったりします。

    upath

    僕が最近目撃したのはupath@1.0.4というパッケージ関連の事です。このupath@1.0.4ではengines>=4 <=9と指定されているようで、既にほかプロジェクトでは1011を使っていたので結構な頻度で引っかかりイライラしていました。

    error upath@1.0.4: The engine "node" is incompatible with this module.
    Expected version ">=4 <=9". Got "11.13.0"

    しかもこれは直接追加したパッケージではなく、あるパッケージの依存パッケージの中で入っているであろうパッケージでいした。

    しかし、そのあとにリリースされたこのパッケージのnodeensinesnode>=4へ修正されたので、そちらを使うようにすれば解決できそうです。

    resolutions

    yarn - 選択的な依存関係の解決

    これをpackage.jsonresolutionsへ設定することで直接的な依存関係は弄らずにupathだけのバージョンを上げることができます。

    現在のupathの最新バージョンは1.1.2です。upath@1.1.2を使うようにするためには以下のようにします。

    {
      "resolutions": {
        "upath": "1.1.2"
      }
    }

    そしてyarnするだけです。yarnyarn.lockは以下のように更新されていました。

    -upath@^1.0.0:
    -  version "1.0.4"
    -  resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
    -  integrity sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==
    +upath@1.1.2, upath@^1.0.0:
    +  version "1.1.2"
    +  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
    +  integrity sha512-kXpym8n

    一応他のバージョンは、

    となっています。