調べてみると拡張子はzipなんだけど、実際にはxlsファイルだと判明。。。
ソースを追っていくと以下の部分が該当箇所。
export_nameには出力するファイル名と拡張子が入っています。issues_xlsはxlsファイルの内容で、zipの場合はこの後にrubyzipを使ってzipファイルにする処理があります。
export_name[1] == 'zip'はtrueだけど、Zip::ZipOutputStream::write_bufferがfalseの場合は、現象が起きるルートになります。
issues_xls=issues_to_xls2(@issues, @project, @query, @settings) return issues_xls unless export_name[1] == 'zip' && defined?(Zip::ZipOutputStream::write_buffer)
Zip::ZipOutputStream::write_bufferがない?
rubyzipをrequireしているのにZip::ZipOutputStream::write_bufferがないってどういうこと?いろいろ調べていくと、Redmine DMSF Pluginが入っている場合に起きる事が判明。
DMSF Pluginではrubyzipではなくzipをbundlerでインストールしていました。
これによってrubyzipとzipの両方がgemに入っている状態になります。
どちらのプラグインも、以下のようにしてロードしています。
require 'zip/zip'
しかし、ロードパスの優先順位の関係でzipのほうがrubyzipよりも先に見つかるので、zipがrequireされます。
そして、zipにはZip::ZipOutputStream::write_bufferが含まれていない、というのが原因でした。
調査と対応
XLS Export Pluginだけrubyzipを呼び出す方法とかないのかな?と、いろいろ調べてみたんですが分からず。rubyzipとzipでdiffをとるとrubyzipのほうが包含しているようにみえたので、DMSF Pluginにrubyzip使ってもらえないかとPull-Requestしたら取り込んでもらえました。
いっけんらくちゃくw
#でも、そもそもZip::ZipOutputStream::write_bufferが無い場合にzip拡張子で出すという処理自体にも問題があると思うんですが。。。
0 件のコメント:
コメントを投稿