トップ «前の日記(2023/01/12 (木) ) 最新 次の日記(2023/01/14 (土) )» 編集 RSS feed

HsbtDiary


2023/01/13 (金) [長年日記]

macOS でシステムレベルで環境変数を設定したい

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 をできればハードコードしたくないのだけどこの辺はしょうがないのでなんか上手い方法があったら頑張ろうと思う。

macOS でシステムレベルで PATH を設定したい

上のエントリの続編です。書いたような launchctl を使う方法で PATH を設定しようと思っても、既存の PATH を壊さないで設定する、というのができないぽくなんか方法はあるかと調べてみたら

  • /etc/paths にパスを追加する
  • /etc/paths.d/ の下にパスを書いたファイルを追加する

でできるということがわかったので、$GOBIN$CARGO_HOME/bin, homebrew の bin などを追記したファイルを適当に作って /etc/paths.d の下に入れることで解決した。

これで、XDG にこだわった vscode の上でも rbenv の任意のバージョンの Ruby で色々できるようになったかなあ。

アーティゾン美術館のパリ・オペラ座 -響きあう芸術の殿堂を見てきた

朝起きて朝食食べたらすぐ仕事開始、気がついたら夜、みたいな暮らしをしていると11-12h労働の毎日なので今日は昼過ぎにチャチャっと終わりにして、日本橋のアーティゾン美術館に行ってきた。平日に机に座っているととにかく何かをしてしまうので外に行くしかない。

アーティゾン美術館にしては珍しく、所蔵作品を交えない展示が中心になっていてほとんどが撮影不可能だったのがうーむではあったけど、パリのオペラ座を中心にした構成は歴史を勉強できる意味でもよかった。4F の展示はいつも通りの所蔵品展ではあったけど、このいつも通りがアーティゾンの魅力なのでこれはこれで良い。

帰りに高島屋と丸善によって軽く買い物をしてから帰宅。毎週金曜はこんな感じでもいいかもなあ。