読者です 読者をやめる 読者になる 読者になる

HPCメモ

HPC(High Performance Computing)に関連したりしなかったりすることのメモ書き

chef -zeroでwindows用開発環境を構築(その4)

運用を始めてから気付いたことをバラバラとメモっときます。

gitでエラーになる

gitのレシピを実行すると、こんなエラーが発生する時があります。

FATAL: Errno::EIO: git[C:\WORK\unix_home] (update_home_dir::default line 10) had an error: Errno::EIO: Input/output error - CreateProcessW

ここにissueとして出てますが、gitじゃなくてgit.exeを呼ばないと発生するエラーだそうです。
git resource Errno::EIO on windows · Issue #1622 · chef/chef · GitHub
そのうち解決されると思いますが、とりあえずのワークアラウンドとしてこんな感じに修正しておきました。

if platform_family?('windows')
    git_command="git.exe"
else
    git_command="git"
end

#clone remote repo to $HOME if not exist
if ! ::File.directory?("#{ENV['HOME']}/.git")
    execute "git init" do
        command  "#{git_command} init"
        cwd      "#{ENV['HOME']}"
    end
    execute "git remote add" do
        command  "#{git_command} remote add origin #{node['update_home_directory']['repo']}"
        cwd      "#{ENV['HOME']}"
    end
end

execute "git pull" do
    command  "#{git_command} pull origin master"
    cwd      "#{ENV['HOME']}"
end
execute "git submodule" do
    command  "#{git_command} submodule update --init --recursive"
    cwd      "#{ENV['HOME']}"
end

cloneせずに、わざわざinitしてからpullしてますが、これはこのエラーとは無関係で、gitが実行される前に%HOME%\.chefディレクトリが作られてしまってgit cloneに失敗することへの対策です。

windows_packageの羃等性

githubのページに書かれているように、windows_packageに渡す名前は[コントロールパネル]->[プログラムと機能]のリストに表示されている名前と正確に一致させていないと、インストール済かどうかの判定に失敗します。
opscode-cookbooks/windows · GitHub
でもって、この名前はプログラムによってバージョン名を含むものや含まないものが混在しているので、もしバージョン番号が入っていないソフトだったら、アップデートするのが難しくなるので違う名前にしておきましょう。(うちの環境だとAmazon KindleとかcourvusSKKとかがバージョン番号が無いです)

ログオン時に実行させる

スタートアップに追加するのは、専用のリソースが用意されていて、次のようなコードで登録できます。

windows_auto_run "autohotkey" do
    program node['autohotkey']['program_name']
    not_if  {Registry.value_exists?(AUTO_RUN_KEY, "autohotkey")}
    action  :create
end

ショートカットの追加

ショートカットも専用のリソースがあって、こんな感じで追加できます。

windows_shortcut "#{ENV['USERPROFILE']}\\Desktop\\gvim.lnk" do
    target       exe_path
    description  "gvim"
    action       :create
end

本当はスタートメニューとかタスクバーに登録したいんですが、こっちのやり方は分からず・・・

ファイルの関連付け変更

ファイルの関連付けは、コマンドラインからassocやftypeコマンドを使うのが正しいやり方だと思いますが、面倒なのでレジストリを直接いじります。しかし、ぐぐってみると昔のkeyも有効なようで

"HKEY_CURRENT_USER\\Software\\Classes\\.#{ext}\\shell\\open\\command"

に登録するパターンと

"HKEY_CURRENT_USER\\Software\\Classes\\#{ext}_auto_file\\shell\\open\\command"

に登録するパターンのどちらでも良いようです。(#{ext}は拡張子)

うちの環境でテストした限りでは、

  • 後者の方が優先
  • エクスプローラGUIから設定する画面(ファイルを開くプログラムの選択)には後者の方法で登録しないと表示されない

という問題があるので、後者のkeyを使っています。

具体的にはgvimのレシピの中でこんな感じにしてます。

%w{rb py js txt log c C cpp h f F f90 F90}.each do |ext|
    registry_key "set file type assocication by auto_file #{ext}" do
        key    "HKCU\\Software\\Classes\\#{ext}_auto_file\\shell\\open\\command"
        values [{
            :name => "",
            :type => :string,
            :data => "#{exe_path} %1"
        }]
        recursive true
    end
end