運用を始めてから気付いたことをバラバラとメモっときます。
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}は拡張子)
うちの環境でテストした限りでは、
という問題があるので、後者の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