質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

nodeのarchiverを使用してzipファイルをzipで圧縮したい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 6,280

S_Minecraft

score 29

node.jsのモジュールのarchiverを利用して
zipファイルをzipで圧縮したいです

例えば
a(フォルダ)
-b.txt
-c.zip
-d.png
とあって、
単純にaを圧縮すると
a.zipがcが解凍された状態で圧縮されます
a.zip
-b.txt
-c(フォルダ)
-d.png
こうなるのではなく
a.zip
-b.txt
-c.zip
-d.png
というような感じに圧縮したいです
どうすればできるでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

check解決した方法

0

単純にaを圧縮すると 
a.zipがcが解凍された状態で圧縮されます 
というのはただの思い込みだったようです

実際はzipが入っているフォルダが「.」が先頭のフォルダで除外されていたという状況だったみたいです

回答ありがとうございます

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

// パッケージzip-archiverを利用 https://npmjs.org/package/zip-archiver
var Zip = require('zip-archiver').Zip;

var input  = 'code/';    // 圧縮するディレクトリ
var output = 'code.zip'; // 圧縮後のファイル名

// 圧縮
var zip = new Zip({ file: output });
zip.add(input, function() {
    zip.done();
    console.log('done.'); // 終了メッセージ
});
これは、下記のように 外部 zip コマンドを利用して実行することも出来ます。

// spawnをロード
var spawn = require('child_process').spawn;

// このスクリプトが存在するディレクトリへ変更
process.chdir( __dirname);

// ls -ln /home/hoge/mytest を実行する
var child = spawn('zip', ['-r', 'code.zip', 'code']);

// データが返ってきたら画面に圧縮状況をメッセージ出力
child.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});

// 終了メッセージ
child.on('exit', function (code) {
  console.log('child process exited with code ' + code);
});


// code デレクトリと同じ階層で $ node zip.js を実行すると圧縮された code.zip が生成されます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/21 14:20 編集

    下記エラーが発生したので試せていませんが、
    コードを読む限りzipをzipで圧縮する際に何も対処をとってないように見えますが
    いけるのでしょうか?

    ```
    path.js:233 throw new TypeError('Arguments to path.join must be strings')
    TypeError: Arguments to path.join must be strings
    at Object.win32.join (path.js:233:13)
    at Zip.add(略\node_modules\zip-archiver\lib\index.js:56:25)
    at Object.<anonymous> (D:\zip.js:6:5)
    以下略
    ```

    キャンセル

0

参考に
まず、Gruntを使うには、Node.jsとパッケージ管理ツールnpmが必要になるのでインストールしましょう。私は、Macportsを使ってインストールしましたが、申し訳ないほど簡単です。既にインストールしているか分からないって方は、ターミナルで下記コマンドを実行してバージョン番号が返ってくればインストールされています。

ターミナル
node -v
npm -v
Node.jsとnpmのインストール
まだNode.jsとnpmをインストールしていない方は、ターミナルで下記コマンドを実行して、Node.jsとnpmをインストールしましょう。

ターミナル
sudo port install nodejs
sudo port install npm
grunt-cliのインストール
Node.jsとnpmをインストールしたら、ターミナルで下記コマンドを実行して、Gruntのコマンドラインインターフェイス grunt-cliをインストールします。

ターミナル
sudo npm install -g grunt-cli
Scroll to top

package.jsonの作成

Gruntを使うには、プロジェクトのディレクトリにpackage.jsonとGruntfile.jsが必要になります。今回はデスクトップに置いたgrunt-testディレクトリをプロジェクトのルートディレクトリとして、ここにpackage.jsonファイルを作成してみます。

grunt-testディレクトリの構成
grunt-testディレクトリの構成

まず、ターミナルでcdコマンドを実行して、デスクトップのgrunt-testディレクトリをカレントディレクトリにします。続いて、npm initを実行します。

ターミナル
cd ~/Desktop/grunt-test
npm init
すると、ターミナルで下記項目を順番に質問されるので、答えを入力してreturnキーを押しましょう。基本的に各項目には初期値が用意されているので、entry point以外の項目で必要ないと思うものは、そのままreturnキーを押しても構いません。最後に Is this ok? と聞かれるので、returnキーを押すとカレントディレクトリにpackage.jsonが作成されます。

name:
プロジェクト名を入力します。URLセーフな文字列しか使用できません。
version:
プロジェクトのバージョンを入力します。
description:
プロジェクトの簡単な説明文を入力します。
entry point:
迷わず、Gruntfile.jsと入力します。
test command:
そのままreturnキーを押します。
git repository:
Gitレポジトリがあれば入力します。
keywords:
キーワードがあれば、カンマ区切りで入力します。
author:
製作者名を入力します。
license:
ライセンスを入力します。
この時点でpackage.jsonの中身を覗いてみると、こんな感じになっています。

package.json
{
  "name": "grunt-test",
  "version": "0.1.0",
  "description": "This is test.",
  "main": "Gruntfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "@u_kudox",
  "license": "public domain"
}
Scroll to top

Gruntとプラグインのインストール

それでは、いよいよGruntとプラグインのインストールです。grunt-cliのインストールは最初の1回だけですが、Gruntとプラグインはプロジェクト毎にインストールする必要があります。

Gruntのインストール
ターミナルで下記コマンドを実行すると、プロジェクトのルートディレクトリにnode_modulesディレクトリが作成され、そこにGruntがインストールされます。–save-devオプションを付けることにより、package.jsonに必要な情報を追加してくれます。

ターミナル
cd ~/Desktop/grunt-test
npm install grunt --save-dev
プラグインのインストール
続いて、Gruntのプラグインをインストールしましょう。npm install プラグイン名 –save-dev コマンドで、指定したプラグインがnode_modulesディレクトリにインストールされます。

ターミナル
npm install grunt-contrib-cssmin --save-dev
npm install grunt-contrib-uglify --save-dev
npm install grunt-contrib-copy --save-dev
npm install grunt-contrib-watch --save-dev
npm install grunt-contrib-yuidoc --save-dev
npm install grunt-contrib-compress --save-dev
今回は、下記のプラグインだけをインストールしましたが、Gruntには数えきれない程のプラグインがあります。興味のある方は、こちらで探してみて下さい。

grunt-contrib-cssmin
CSSファイルを圧縮する。
grunt-contrib-uglify
JavaScriptファイルを圧縮する。
grunt-contrib-copy
ファイルやディレクトリをコピーする。
grunt-contrib-watch
ファイルの変更を監視してタスクをトリガーする。
grunt-contrib-yuidoc
YUIDocを書き出す。
grunt-contrib-compress
ファイルやディレクトリをzip/gzipなどの形式で圧縮する。
Scroll to top

Gruntfile.jsの作成

これでGruntを使用する準備が整いましたが、実際にGruntを使用するには、プロジェクトのディレクトリにGruntfile.jsを作成し、タスクの設定やプラグインのロードを指定する必要があります。まず、Gruntfile.jsの基本的な書式を見てみましょう。

すべてのGrunt用のコードは、module.exportsというラッパー関数の内部に記述します。そして、grunt.initConfigで各タスクの設定をJSON形式で指定し、grunt.loadNpmTasksでプラグインのロードを指定します。

Gruntfile.jsの基本的な書式
module.exports = function(grunt) {
  grunt.initConfig({
    // タスクの設定
  });
  // プラグインのロード
  grunt.loadNpmTasks('プラグイン名');
};
Scroll to top

タスクの設定とGruntの実行

それでは、Gruntfile.jsでタスクを設定し、実際にGruntを実行してみましょう。ターミナルでgruntコマンドを実行する際は、cdコマンドでGruntfile.jsを置いたディレクトリをカレントディレクトリにしてから、実行して下さい。

CSSの圧縮
CSSの圧縮は、grunt-contrib-cssminプラグインで行います。grunt.initConfigにcssminプロパティを追加し、ターゲットを指定します。srcは圧縮前の元ファイル、destは圧縮・結合後のファイルになります。下記の例では、pc, mobileというプロパティ名でターゲットを指定していますが、この名前は任意の文字列で構いません。

Gruntfile.js
grunt.initConfig({
  cssmin : {
    pc : {
      src : ['css/reset.css', 'css/styles.css'],
      dest : 'css/pc.min.css'
    },
    mobile : {
      src : ['css/reset.css', 'css/styles.css', 'css/mediaqueries.css'],
      dest : 'css/mobile.min.css'
    }
  }
});
grunt.loadNpmTasks('grunt-contrib-cssmin');
タスクを実行するには、ターミナルでgrunt cssminを実行します。また、grunt cssmin:mobileのようにすることで、実行するターゲットを指定することもできます。

ターミナル
grunt cssmin
JavaScriptの圧縮
JavaScriptの圧縮は、grunt-contrib-uglifyプラグインで行います。grunt.initConfigにuglifyプロパティを追加し、ターゲットを指定します。下記の例では、オプションにbannerを指定し、ファイルの先頭にライセンス表記のコメントを追加しています。

Gruntfile.js
grunt.initConfig({
  uglify : {
    build : {
      options : {
        banner : grunt.file.read('js/License.js'),
      },
      src : ['js/BitmapData.js', 'js/GlowFilter.js'],
      dest : 'js/all.min.js'
    }
  }
});
grunt.loadNpmTasks('grunt-contrib-uglify');
タスクを実行するには、ターミナルでgrunt uglifyを実行します。grunt uglify:ターゲット名で実行するターゲットを指定することもできます。

ターミナル
grunt uglify
ファイルやディレクトリのコピー
grunt-contrib-copyプラグインを使うとファイルやディレクトリをコピーすることができます。grunt.initConfigにcopyプロパティを追加し、ターゲットを指定します。下記の例では、cssディレクトリ内の’.min.css’で終わるファイルをsample/cssディレクトリに、jsディレクトリ内の’.min.js’で終わるファイルをsample/jsディレクトリにコピーするようにしています。

Gruntfile.js
grunt.initConfig({
  copy : {
    css : {
      files : [{expand:true, cwd:'css/', src:'*.min.css', dest:'sample/css/'}]
    },
    js : {
      files : [{expand:true, cwd:'js/', src:'*.min.js', dest:'sample/js/'}]
    }
  }
});
grunt.loadNpmTasks('grunt-contrib-copy');
タスクを実行するには、ターミナルでgrunt copyを実行します。grunt copy:ターゲット名で実行するターゲットを指定することもできます。

ターミナル
grunt copy
ファイルの変更を監視
grunt-contrib-watchプラグインを使うとファイルの変更を監視して、ファイルが変更された際に登録したタスクを実行することができます。grunt.initConfigにwatchプロパティを追加し、filesで監視するファイル、tasksでファイルが変更された際に実行するタスクを指定します。

Gruntfile.js
grunt.initConfig({
  watch : {
    css_pc : {
      files : ['css/reset.css', 'css/styles.css'],
      tasks : ['cssmin', 'copy:css']
    },
    css_mobile : {
      files : ['css/mediaqueries.css'],
      tasks : ['cssmin:mobile', 'copy:css']
    },
    js : {
      files : ['js/BitmapData.js', 'js/GlowFilter.js', 'js/License.js'],
      tasks : ['uglify', 'copy:js']
    }
  }
});
grunt.loadNpmTasks('grunt-contrib-watch');
ファイルの監視を開始するには、ターミナルでgrunt watchを実行します。grunt watch:ターゲット名で監視するターゲットを指定することもできます。監視を終了するには、ターミナルでcontrolキーを押しながらcキーをタイプします。

ターミナル
grunt watch
YUIDocの書き出し
grunt-contrib-yuidocプラグインを使うとGruntでYUIDocを書き出すことができます。下記の例では、grunt.file.readJSONでpackage.jsonを読み込み、その値をYUIDocのパラメータに利用しています。実行するとdocsディレクトリにYUIDocのドキュメントが書き出されます。

Gruntfile.js
grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  yuidoc : {
    compile : {
      name : '<%= pkg.name %>',
      description : '<%= pkg.description %>',
      version : '<%= pkg.version %>',
      options : {
        paths : 'js',
        outdir : 'docs'
      }
    }
  }
});
grunt.loadNpmTasks('grunt-contrib-yuidoc');
YUIDocを書き出すには、ターミナルでgrunt yuidocを実行します。grunt yuidoc:ターゲット名で、実行するターゲットを指定することもできます。

ターミナル
grunt yuidoc
ファイル・ディレクトリの圧縮
grunt-contrib-compressプラグインを使うとファイルやディレクトリをzipなどの形式で圧縮することができます。下記の例では、先程docsディレクトリに書き出したYUIDocのドキュメント全体を1つのzipファイルに圧縮してoutputディレクトリに保存しています。

Gruntfile.js
grunt.initConfig({
  compress : {
    docs : {
      options : {
        archive : 'output/docs.zip'
      },
      files : [{expand:true, src:'**', cwd:'docs'}]
    }
  }
});
grunt.loadNpmTasks('grunt-contrib-compress');
圧縮を実行するには、ターミナルでgrunt compressを実行します。grunt compress:ターゲット名で、実行するターゲットを指定することもできます。

ターミナル
grunt compress
カスタムタスク
grunt.registerTaskを使うと複数のタスクを組み合わせたり、オリジナルのタスクを登録することができます。下記の例では、先程の例で示したYUIDocの作成・ドキュメントのzip化という一連のタスクをdocsという名前で登録しています。

Gruntfile.js
grunt.registerTask('docs', ['yuidoc:compile', 'compress:docs']);
タスクを実行するには、ターミナルでgrunt ‘タスク名’ を実行します。

ターミナル
grunt docs
Scroll to top

Gruntfile.jsのサンプル

最後に今回のテストで作成したGruntfile.jsをサンプルとして載せておきます。初めてGruntを使ってみた感想としては、こんなに便利ならもっと早く導入してれば良かったと後悔しています。まだGruntを試されていない方は、これを期にGruntを導入されてみては如何でしょうか? 以上、Gruntの使い方レポートでした。

Gruntfile.js
module.exports = function(grunt) {
  grunt.initConfig({
    pkg : grunt.file.readJSON('package.json'),
    cssmin : {
      pc : {
        src : ['css/reset.css', 'css/styles.css'],
        dest : 'css/pc.min.css'
      },
      mobile : {
        src : ['css/reset.css', 'css/styles.css', 'css/mediaqueries.css'],
        dest : 'css/mobile.min.css'
      }
    },
    uglify : {
      build : {
        options : {
          banner : grunt.file.read('js/License.js'),
        },
        src : ['js/BitmapData.js', 'js/GlowFilter.js'],
        dest : 'js/all.min.js'
      }
    },
    copy : {
      css : {
        files : [{expand:true, cwd:'css/', src:'*.min.css', dest:'sample/css/'}]
      },
      js : {
        files : [{expand:true, cwd:'js/', src:'*.min.js', dest:'sample/js/'}]
      }
    },
    watch : {
      css_pc : {
        files : ['css/reset.css', 'css/styles.css'],
        tasks : ['cssmin', 'copy:css']
      },
      css_mobile : {
        files : ['css/mediaqueries.css'],
        tasks : ['cssmin:mobile', 'copy:css']
      },
      js : {
        files : ['js/BitmapData.js', 'js/GlowFilter.js', 'js/License.js'],
        tasks : ['uglify', 'copy:js']
      }
    },
    yuidoc : {
      compile : {
        name : '<%= pkg.name %>',
        description : '<%= pkg.description %>',
        version : '<%= pkg.version %>',
        options : {
          paths : 'js',
          outdir : 'docs'
        }
      }
    },
    compress : {
      docs : {
        options : {
          archive : 'output/docs.zip'
        },
        files : [{expand:true, src:'**', cwd:'docs'}]
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-cssmin');
  grunt.loadNpmTasks('grunt-contrib-uglify');
  grunt.loadNpmTasks('grunt-contrib-copy');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-yuidoc');
  grunt.loadNpmTasks('grunt-contrib-compress');

  grunt.registerTask('docs', ['yuidoc:compile', 'compress:docs']);
};

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る