Cygwin Rubyにwin32utilsのwin32-clipboardをインストールする
Rubyist Magazineの
「Ruby Library Report 【第 4 回】 Win32Utils」
http://jp.rubyist.net/magazine/?0005-RLR
この記事を読んで、Rubyでも簡単にクリップボードが使えるのだと思ってCygwin Rubyにwin32-clipboardをインストールして動かしてみようと思ったのですが、私がまだRuby初心者のこともあっていろいろと苦労しましたので報告したいと思います。
結論として現在の最新版のwin32-clipboard-0.4.3をCygwin Rubyのgemsに以下の手順でインストールしました。
1. win32-apiのビルドとインストール
本来であればwin32-apiはgemでwin32-clipboardに関連するパッケージとしてインストールできるはずなのですがgemを使ったインストールがうまくいきません。
そこでzipファイルをダウンロードして手動でビルドとインストールを実行します。
1.1. win32-api-1.0.3.zipをダウンロード
RubyForgeのwin32utilsのダウンロードページからwin32-api-1.0.3.zipをダウンロードして、適当な場所に展開します。
1.2. rakeとnmakeの準備
win32-api-1.0.3のビルドとインストールにはrakeとnmakeが必要です。
rakeがインストールされていない場合にはgemでインストールします。
gem install rake --remote
Rakefileの中でnmakeが使用されていますのでnmakeが存在しない場合には対応が必要です。
Rakefileの中のnmakeの記述をmakeに修正するという手もありますが、私はCygwinのmakeをシンボリックリンクすることで対応しました。
ln -s /usr/bin/make /usr/local/bin/nmake
1.3. win32-apiのビルド
win32-api-1.0.3.zipファイルを展開したフォルダに移動してrakeでbuildタスクを実行します。
rake -f Rakefile build
1.4. gemsにインストール
rakeでinstall_gemを実行します。
rake -f Rakefile install_gem
2. gemで残りのコンポーネントをインストール
これで残りのコンポーネントをすべてgemでインストールします。
gem install win32-clipboard --remote --include-dependencies
3. 動作の確認
irbで動作確認を行います。
$ irb irb(main):001:0> require 'Win32API' => true irb(main):002:0> require 'rubygems' => true irb(main):003:0> require 'win32/clipboard' => true irb(main):004:0> include Win32 => Object irb(main):005:0> Clipboard.set_data 'Hello!' => Win32::Clipboard irb(main):006:0> Clipboard.data => "Hello!" irb(main):007:0> Clipboard.set_data 'Hi World!!' => Win32::Clipboard irb(main):008:0> Clipboard.data => "Hi World!!" irb(main):009:0>
以上でインストール完了です。
あと同様の問題ではまった方のために私がトラブったところを以下に解説しておきます。
始めにいきなりwin32-clipboardをgemでインストールしようとしたら以下のようなエラーになってしまいました。
$ gem install win32-clipboard --remote --include-dependencies Select which gem to install for your platform (i386-cygwin) 1. win32-api 1.0.3 (mswin32) 2. win32-api 1.0.3 (ruby) 3. win32-api 1.0.2 (mswin32) 4. win32-api 1.0.2 (ruby) 5. Skip this gem 6. Cancel installation > 2 Building native extensions. This could take a while... ERROR: While executing gem ... (Gem::Installer::ExtensionBuildError) ERROR: Failed to build gem native extension. ruby extconf.rb install win32-api --remote checking for strncpy_s()... no creating Makefile make make: Nothing to be done for `all'. make install make: *** No rule to make target `/usr/local/lib/ruby/gems/1.8/gems/win32-api-1.0.3/lib/win32', needed by `install-so'. Stop. Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/win32-api-1.0.3 for inspection. Results logged to /usr/local/lib/ruby/gems/1.8/gems/win32-api-1.0.3/ext/gem_make.out
またここで"1. win32-api 1.0.3 (mswin32)"を選択するとインストールは正常終了しますが実行時に以下の様なエラーになります。
$ irb -rubygems irb(main):001:0> require 'Win32API' => true irb(main):002:0> require 'win32/clipboard' NameError: uninitialized constant Windows::API::Win32 from /usr/local/lib/ruby/gems/1.8/gems/windows-api-0.2.0/lib/windows/api.rb:211:in `initialize' from /usr/local/lib/ruby/gems/1.8/gems/windows-pr-0.7.1/lib/windows/clipboard.rb:26 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in`require' from /usr/local/lib/ruby/gems/1.8/gems/win32-clipboard-0.4.3/lib/win32/clipboard.rb:1 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in`require' from (irb):2
次にwin32-apiのbuildの際にnmakeが存在しない場合には以下の様なエラーになります。
$ rake -f Rakefile build (in /home/Yoichi/win32-api-1.0.3) cp win32/api.c . /usr/local/bin/ruby extconf.rb checking for strncpy_s()... no creating Makefile nmake rake aborted! Command failed with status (127): [nmake...] /home/Yoichi/win32-api-1.0.3/Rakefile:36 (See full trace by running task with --trace)
あと動作確認の際にwin32-clipboardの仕様変更に戸惑いました。
以前にはwin32-clipboardは"require 'win32/clipboard'"だけで良かったようですが、該当のバージョンではこの前に"require 'Win32API'"が必要になっています。
またクリップボードへのテキストの貼り付けの際に以前はWin32::Clipboard.dataへの代入で良かった様ですが、該当のバージョンはWin32::Clipboard.set_data関数を使用する様になっています。(不具合っぽい?)
具体的な動作は以下のとおりです。
$ irb -rubygems irb(main):001:0> require 'win32/clipboard' NameError: uninitialized constant Win32::Clipboard::Win32API from /usr/local/lib/ruby/gems/1.8/gems/win32-clipboard-0.4.3/lib/win32/c lipboard.rb:25 from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in `require' from (irb):1 irb(main):002:0> quit $ irb -rubygems irb(main):001:0> require 'Win32API' => true irb(main):002:0> require 'win32/clipboard' => true irb(main):003:0> Win32::Clipboard.data = 'text data' NoMethodError: undefined method `data=' for Win32::Clipboard:Class from (irb):3 irb(main):004:0> Win32::Clipboard.set_data 'text data' => Win32::Clipboard irb(main):005:0> Win32::Clipboard.data => "text data" irb(main):006:0>
またRuby初心者の私は以下のことを学びました。
- rakeについて
- gemsのコンポーネントを利用する場合にはコマンドラインで-rubygemsオプションを使用するか、"require 'rubygems'"が必要であること
- gemsのインストール先の配置構成
まだまだ、、、、
ですね。
2007-10-14:追記
従来のWin32APIは将来dl/win32で置き換えられる予定ということです。
"ruby 1.8.4 (2005-12-24) [i386-cygwin]"で"require 'Win32API'"の箇所を"require 'dl/win32'"としても動作します。