🎉

nixでgoogle-cloud-sdkの追加コンポーネントをインストールする

2022/11/18に公開

背景

nixでインストールした google-cloud-sdkでpubsub-emulatorをインストールすると失敗した。
どう解決するのがいいだろうか。

結論

withExtraComponentsでコンポーネントで指定すればインストールできた。
以下はshell.nixでpubsub-emulatorを入れる例

let
  google-cloud-sdk-with-pubsub-emulator = pkgs.google-cloud-sdk.withExtraComponents ([pkgs.google-cloud-sdk.components.pubsub-emulator]);
in pkgs.mkShell {
  packages = with pkgs;
    [google-cloud-sdk-with-pubsub-emulator];
}

調査記録

pubsub-emulatorをインストール仕様とすると外部パッケージマネージャでインストールしている場合はコンポーネントのインストールができない旨が表示された。

$ gcloud components install pubsub-emulator
ERROR: (gcloud.components.install) You cannot perform this action because this Google Cloud CLI installation is managed by an external package manager.
Please consider using a separate installation of the Google Cloud CLI created through the default mechanism described at: https://cloud.google.com/sdk/

yumやaptようにパッケージが用意されている。

解決策はないかGoogleを検索していると以下のissueに対応方法が書かれていた。

google-cloud-sdk.withExtraComponents ([google-cloud-sdk.components.cloud-build-local])

https://github.com/NixOS/nixpkgs/issues/99280#issuecomment-1227334798

これをヒントにnixファイルのソースを確認すると コンポーネントのための対応がある。

  components = callPackage ./components.nix {
    snapshotPath = ./components.json;
  };

  withExtraComponents = callPackage ./withExtraComponents.nix { inherit components; };

https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/tools/admin/google-cloud-sdk/default.nix#L24-L28

components.jsonを確認するとpubsub-emulatorの存在が確認できる。

    {
      "data": {
        "checksum": "dbbe307e52c01e3eedcd35289294dc59fc5c0c8657910b601052adc48b407390",
        "contents_checksum": "decda81656821c8e576718753c79ddac1a61659a2db05f0769d1bc1c172fd255",
        "size": 65403474,
        "source": "components/google-cloud-sdk-pubsub-emulator-20221028134157.tar.gz",
        "type": "tar"
      },
      "dependencies": [
        "core"
      ],
      "details": {
        "description": "Provides the Pub/Sub emulator.",
        "display_name": "Cloud Pub/Sub Emulator"
      },
      "id": "pubsub-emulator",
      "is_configuration": false,
      "is_hidden": false,
      "is_required": false,
      "platform": {},
      "platform_required": false,
      "version": {
        "build_number": 20221028134157,
        "version_string": "0.7.1"
      }
    },

https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/tools/admin/google-cloud-sdk/components.json#L6451-L6476

components.nixではこの情報を用いてderivationを作成し返す関数となっている。
これがdefault.nixの中でよまれ、passthruに渡されているため、 nixpkgs.google-cloud-sdk.comonponentsでアクセスできる。

  passthru = {
    inherit components withExtraComponents;
  };

https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/tools/admin/google-cloud-sdk/default.nix#L112-L114
https://nixos.org/manual/nixpkgs/stable/#special-variables

そして、withExtraComponentsではcompsを受け取る関数であり、derivationの追加コマンドとしてrunCommandが追加されるような感じのようである。

comps_:

https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/tools/admin/google-cloud-sdk/withExtraComponents.nix#L3

Discussion