vscode やその他の開発に関係するアプリケーションを使う時に、いわゆるターミナルとシェルの上で動かすことで任意の環境変数を渡せるというのは当たり前の話なのだが、これをターミナルやシェルを経由しないで動かした時も反映させたくて、いい感じの方法はないものか、と探していてやっと解決方法を見つけた
macOSでGUIアプリの環境変数を設定する方法探求 - Qiita
というのも vscode で rust や go, rbenv を使うときに上記のような環境変数を設定したくて、いつもシェルから起動しているんだけど、アップデートで再起動を押すとシェルをスキップして起動して何かしらのプラグインがエラー、とか $HOME の下に go
ディレクトリとかをばら撒くということがあってなんとかしたいのだった。
launchctl
を使う方法は以前も見ていて、load
だけだと反映されないけど、なんで〜なんでや〜と頭を抱えていたんだけど、 bootstarap gui/$uid
を付与することで反映されるのを確認した。(なお、~/Library/LaunchAgents
に入れることで次回起動時には反映される)
で、設定したい環境変数ごとに plist ファイルを作成するのもだるいので以下のようなファイルを作って
GOPATH,/Users/hsbt/.local/share/go
CARGO_HOME,/Users/hsbt/.local/share/cargo
VSCODE_PORTABLE,/Users/hsbt/.local/share/vscode
以下のような Rakefile を実行して自動生成するようにした。
task :push_system_env do
system "sudo cp toolbox/system/paths /etc/paths.d/paths"
uid = `id -u`.chomp
File.open("toolbox/system/env").each do |line|
k, v = line.split(",").map(&:chomp)
plist = <<~EOS
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>#{k}.SetEnv</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>setenv</string>
<string>#{k}</string>
<string>#{v}</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
EOS
system "launchctl bootout gui/#{uid} #{File.expand_path("~/Library/LaunchAgents/#{k}.SetEnv.plist")}"
File.open(File.expand_path("~/Library/LaunchAgents/#{k}.SetEnv.plist"), "w") do |f|
f.puts plist
end
system "launchctl bootstrap gui/#{uid} #{File.expand_path("~/Library/LaunchAgents/#{k}.SetEnv.plist")}"
end
end
task :purge_system_env do
system "sudo rm /etc/paths.d/paths"
uid = `id -u`.chomp
File.open("toolbox/system/env").each do |line|
k, v = line.split(",").map(&:chomp)
system "launchctl bootout gui/#{uid} #{File.expand_path("~/Library/LaunchAgents/#{k}.SetEnv.plist")}"
FileUtils.rm File.expand_path("~/Library/LaunchAgents/#{k}.SetEnv.plist")
end
end
$HOME
をできればハードコードしたくないのだけどこの辺はしょうがないのでなんか上手い方法があったら頑張ろうと思う。
上のエントリの続編です。書いたような launchctl を使う方法で PATH を設定しようと思っても、既存の PATH を壊さないで設定する、というのができないぽくなんか方法はあるかと調べてみたら
/etc/paths
にパスを追加する/etc/paths.d/
の下にパスを書いたファイルを追加するでできるということがわかったので、$GOBIN
や $CARGO_HOME/bin
, homebrew の bin などを追記したファイルを適当に作って /etc/paths.d
の下に入れることで解決した。
これで、XDG にこだわった vscode の上でも rbenv の任意のバージョンの Ruby で色々できるようになったかなあ。
朝起きて朝食食べたらすぐ仕事開始、気がついたら夜、みたいな暮らしをしていると11-12h労働の毎日なので今日は昼過ぎにチャチャっと終わりにして、日本橋のアーティゾン美術館に行ってきた。平日に机に座っているととにかく何かをしてしまうので外に行くしかない。
アーティゾン美術館にしては珍しく、所蔵作品を交えない展示が中心になっていてほとんどが撮影不可能だったのがうーむではあったけど、パリのオペラ座を中心にした構成は歴史を勉強できる意味でもよかった。4F の展示はいつも通りの所蔵品展ではあったけど、このいつも通りがアーティゾンの魅力なのでこれはこれで良い。
帰りに高島屋と丸善によって軽く買い物をしてから帰宅。毎週金曜はこんな感じでもいいかもなあ。