🎉
nixでgoogle-cloud-sdkの追加コンポーネントをインストールする
背景
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])
これをヒントにnixファイルのソースを確認すると コンポーネントのための対応がある。
components = callPackage ./components.nix {
snapshotPath = ./components.json;
};
withExtraComponents = callPackage ./withExtraComponents.nix { inherit components; };
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"
}
},
components.nixではこの情報を用いてderivationを作成し返す関数となっている。
これがdefault.nixの中でよまれ、passthruに渡されているため、 nixpkgs.google-cloud-sdk.comonponents
でアクセスできる。
passthru = {
inherit components withExtraComponents;
};
そして、withExtraComponentsではcompsを受け取る関数であり、derivationの追加コマンドとしてrunCommandが追加されるような感じのようである。
comps_:
Discussion