イマドキ は Visual Studio Code で GitHub Copilot を動かすのだそうです。(本当?)Vim に引き篭もるばかりでは健康にも悪そうです。
というわけでちょっと外の空気でも・・むむ、大きな壁が。導入の段階において Windows や macOS であればスムーズに構築できるのですが、悲しいかな NixOS だとそうもいきません。
NixOS 以外のユーザから見たら「なんでこんなに長いのw」と笑っていただけるような内容になったかもしれません。(基本的に私に向けた記録です。)
さて本当かどうか、さっそく Visual Studio Code(以下OSS版)を入れてみましょう。
$ nix-shell -p vscode
error:
… while calling the 'derivationStrict' builtin
at /builtin/derivation.nix:9:12: (source not available)
…
a) To temporarily allow unfree packages, you can use an environment variable
for a single invocation of the nix tools.
$ export NIXPKGS_ALLOW_UNFREE=1
Note: For `nix shell`, `nix build`, `nix develop` or any other Nix 2.4+
(Flake) command, `--impure` must be passed in order to read this
environment variable.
b) For `nixos-rebuild` you can set
{ nixpkgs.config.allowUnfree = true; }
in configuration.nix to override this.
Alternatively you can configure a predicate to allow specific packages:
{ nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
"vscode"
];
}
c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add
{ allowUnfree = true; }
to ~/.config/nixpkgs/config.nix.
いきなり面を食らったかと思います。NixOS には「Unfreeなパッケージは事前の許可が必要」という仕組みが存在するためです。
とりあえず「NIXPKGS_ALLOW_UNFREE
」を利用してみます。shell.nix
を用意しておけば以下で成立すると思います。(shellHook
にcode
を入れておくと起動の手間を省けます。)
$ NIXPKGS_ALLOW_UNFREE=1 nix-shell
code
で起動できたと思います。さてここでユーザ空間に正式に導入するか考えてみます。
ユーザ空間に導入するメリットを列挙してみます。
- nix-shell を起動する必要が無い。
- 事前に「
NIXPKGS_ALLOW_UNFREE
」を考慮しなくて良い。 Extensions
をNix側で管理できる。(有効なパッケージが存在する場合に限る。)
書いた手前、最後はあまりオススメできません。理由は以下の通りです。
- 欲しい
Extension
のパッケージが存在しない場合がある。 - 機能の一部が正常に動作しない場合がある。(
github.copilot.suggest.terminal.command
など。)
また Visual Studio Code 内のExtensions
から管理する場合は素直にvscode
(パッケージ)を利用した方が良いです。(同期は「Settings Sync
」に任せるのが手かもしれません。)私の環境では以下の結果になりました。
vscode
:Extension
をインストールでき、正常に動作する。vscode-with-Extensions
:Extension
をインストールできない。vscodium
:Extension
をインストールできるが、機能の一部が正常に動作しない。(またログイン状態を維持できないかも。)
まあ折角なのでユーザ空間に導入しましょう。最初のエラーを回避するには、flake.nix
などに以下の宣言を加えます。
nixpkgs.config.allowUnfree = true;
Unfreeなパッケージがvscode
だけの場合、ここは口惜しいポイント(デメリット)かと思います。しかしトレードオフだと考えるしかなさそうです。
この残念な気持ちを少し緩和するために「Unfreeという目印」が欲しいところです。方法はいくつか考えられます。
私の場合はvscode
を宣言しているディレクトリの名称をunfree-vscode
としました。unfree
を先頭にしたのはソートを考慮してのことです。
vscode-extensions.github.copilot
を宣言すればExtensions
に追加されますが、先の理由から実施しません。Visual Studio Code を開いて「Sign in to GitHub
」を押下します。
ウェブブラウザに遷移して GitHub の認証画面が表示されれば問題ありません。が、何の反応も無い(ウェブブラウザに遷移しない)パターンもあると思います。
この問題は環境によって様々なため、可能性が高そうな解決策をご紹介します。デスクトップ環境に Freedesktop.org が絡んでいる場合「xdg
」が関係している可能性が高いです。
というのも Visual Studio Code は Freedesktop.org による XDG Base Directory に沿っているようです。したがって xdg-utils によって解決されるという道理です。
xdg-utils
を導入し「デフォルトのブラウザ」を表示してみます。
$ xdg-settings get default-web-browser
chromium-browser.desktop
正しく表示されない場合、ウェブブラウザから設定しますが、コマンドも用意されています。
$ xdg-settings set default-web-browser brave-browser.desktop
「なぜ Firefox(firefox.desktop
)を例に出さないのか」と思われたかもしれません。どうやら Visual Studio Code は Chromium の OS Crypt(モジュール)を使っているからだそうです。
これで「Sign in to GitHub
」からウェブブラウザ(GitHub の認証画面)に遷移できるようになったかと思います。
GitHub へログイン後、Visual Studio Code に戻るとエラーが出るかもしれません。
An OS keyring couldn't be identified for storing the
encryption related data in your current desktop
environment.
Open the troubleshooting guide to address this or you can use weaker
encryption that doesn't use the OS keyring.
キーリング(例: GNOME Keyring)が機能していないからのようです。以下がヒントになると思います。
- Linux: An OS keyring couldn't be identified for storing the encryption related data in your current desktop environment #187338
- Settings Sync#Troubleshooting keychain issues
- Settings Sync#(recommended) Configure the keyring to use with VS Code
キーリング周りをスタートラインから詳解すると大変なことになりますので簡単(詳細な設定内容は省略)に。ミニマルな例として pass(password-store
)および libsecret(pass-secret-service
)を有効にし、~/.vscode/argv.json
(VSCodium の場合は~/.vscode-oss/argv.json
)に"password-store": "gnome"
(code --password-store="gnome"
の永続化)を加えると良さそうです。argv.json
への適用は以下が参考になると思います。
「Use weaker encryption
」で先に進むことはできますが「キーリングが使えていない状態」ということに留意しておく必要があります。
GitHub Copilot のアクセス権が無い場合はエラーが出ます。
No access to GitHub Copilot found. You are currently logged in as <username>.
これは「Signup for GitHub Copilot
」から画面(ウェブブラウザ)の案内に従えば GitHub Copilot のアクセス権を取得できると思います。それでも失敗する場合は再ログインで解消するかもしれません。
お疲れ様でした。これでようやく「イマドキ」に到達ですね。
ちょっと試すだけのつもりが、なんだか長旅になってしまいました。しばらく動かしてみて、フリートライアル終了後の対応を考えたいと思います。
ということで、よっこらしょっと。