epubcheck 必須の META-INF/container.xml リソースが見つかりません.

perl で作成したEPUBファイルの正当性を epubcheck で検証したら下記のエラーが出力された。

FATAL(RSC-002): C:/works/20180504220137.epub/20180504220137.epub(-1,-1): 必須の META-INF/container.xml リソースが見つかりません.
ERROR(RSC-001): C:/works/20180504220137.epub/20180504220137.epub(-1,-1): ファイル 'META-INF/container.xml' が見つかりません.

エラーが検出されました

epubcheck 完了


実装は下記のとおり。
原因は、圧縮対象にファイルを追加する際、相対パスのデリミタにバックスラッシュ(\)を使用していたことにあった。
デリミタをスラッシュ(/)に置換したら無事エラーが解消したが、下記のような下手なプログラムを書くより addTree や addTreeMatching メソッドを使用した方が良いだろう。

use strict;
use lib 'lib';
use utf8;
use autodie;
use Cwd qw(realpath);

sub zip_pack {

  my ($directory, $output_file) = @_;

  use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
  my $zip = Archive::Zip->new();

  #絶対パスを取得
  my $start_dir = realpath($directory);

  use File::Find;

  find( 
    sub {
        my $filepath = $File::Find::name;

        if (! -f $filepath) {
          return;
        }

        #相対パスを取得
        my $relative_path = File::Spec->abs2rel($filepath, $start_dir);

        #デリミタを \ から / に置換
        $relative_path =~ s/\\/\//g;

        my $result = $zip->addFile($filepath, $relative_path);

        if ($relative_path eq 'mimetype') {
          $result->desiredCompressionMethod( COMPRESSION_STORED );
        }
      },
    $start_dir
  );

  $zip->writeToFileNamed($output_file);

}