Help us understand the problem. What is going on with this article?

SketchToolで画像書き出しを自動化

More than 3 years have passed since last update.

こちらはmediba advent calendar 2016の20日目の記事です。

SketchToolとは

SketchTool を使うと、Sketchの書き出しをコマンドラインから行えるようになります。

これにより、エンジニアが「Sketchの使い方分からないから、書き出しはデザイナーよろしく!」と丸投げすることがなくなります。

エンジニアが好きなタイミングで書き出しが出来るようになるので、開発工数が減ることに繋がると思います。

では、使い方の説明です。

SketchToolのインストール

このSketchToolはSketchアプリ本体の中に同梱されているので、以下コマンドを実行すればインストール完了です。

$ cd /Applications/Sketch.app/Contents/Resources/sketchtool/

$ ./install.sh
Installed sketchmigrate Version 1.0 (134) in /usr/local/bin
Installed sketchtool Version 40.3 (33839) in /usr/local/bin

これでインストール完了。

一応、インストールを確認。

$ sketchtool -v
sketchtool Version 40.3 (33839)

SketchToolのコマンド

SketchToolには、主にexportlistの2種類のコマンドが用意されています。

export - 書き出し

Sketchファイルから画像の書き出しをしてくれます。

アートボードの書き出し

$ sketchtool export artboards <file name>

スライスの書き出し

$ sketchtool export slices <file name>

その他、ページ(pages)や、レイヤー(layers)の書き出しにも対応しています。

実際の業務では、アートボードまるごと書き出しはあまり使うことがないと思うので、slicesが一番使うと思います。
(アートボードの書き出しは、保存するだけで書き出してくれるinVisionのアプリが超絶便利!)

オプション

いくつかオプションが用意されています。

オプション名 記述方法
出力先 --output=file path
フォーマット --formats=png, jpg, pdf, eps, svg
出力結果をJSONで吐き出す --outputJSON=file path
SVG圧縮 –compact=YES

list - 情報取得

以下のようにファイルの情報をJSON形式で取得できます。

sketchtool list artboards <file name>

JSONの取得例

{
  "pages" : [
    {
      "id" : "6C085FD4-C3CD-4030-BC4E-847D28D443C1",
      "name" : "Page",
      "bounds" : "0.000000,0.000000,152.000000,152.000000",
      "artboards" : [
        {
          "id" : "A58BE5A2-CAF6-4C59-81C3-D50DF97BCF69",
          "name" : "artbord",
          "rect" : {
            "y" : 0,
            "x" : 0,
            "width" : 152,
            "height" : 152
          },
          "trimmed" : {
            "y" : 0,
            "x" : 0,
            "width" : 152,
            "height" : 152
          }
        }
      ]
    }
  ]
}

「おお、これで色情報や線情報など取得してCSSと連携させられるぞ!」と思いきや、取得できるのは、位置とサイズだけです。。 残念。

npm scriptsでコマンドを管理

毎回コマンドを打つのが面倒なので、こんな感じでpackage.jsonのnpm scriptsで管理するといいと思います。
オプションの情報はconfigで管理するようにしています。

package.json
  // 略
  "config": {
    "filename": "./src/sketch/sample.sketch",
    "dir": "./dist/img/",
    "format": "png"
  },
  "scripts": {
    "exp": "sketchtool export layers $npm_package_config_filename --output=$npm_package_config_dir --format=$npm_package_config_format",
    "list": "sketchtool list artboards $npm_package_config_filename"
  },
  // 略

これで、書き出しはnpm run exp、情報取得はnpm run listと打つだけで出来るようになります。

gulp-sketchを使うともうちょっと便利に

gulp-sketchを使えば、SketchToolをgulp内で実行できます。
ちょっと便利な機能として、Sketchファイル内のレイヤー名に合わせて、フォルダも自動的に生成してくれます。

例えば、レイヤー名をheader/btnとしておくと、書き出し先ににheaderフォルダを作成し、その中にbtn画像を生成してくれるようになります。

レイヤー名をつける手間はありますが、パーツごとにフォルダで生成してくれるので、画像の管理がしやすくなると思います。

次からインストール手順です。

gulp, gulp-sketchインストール

$ npm i -D gulp
$ npm i -D gulp-sketch

gulpfile.jsの作成

var gulp   = require('gulp');
var sketch = require('gulp-sketch');

var sketchOptions = {
    export : 'artboards',
    formats: 'png',
    outputJSON: 'data.json'
};

gulp.task('sketch', function(){
    return gulp.src('./src/sketch/*.sketch')
        .pipe(sketch(sketchOptions))
        .pipe(gulp.dest('./dist/img/'));
});

あとは、gulp sketchコマンドで自動生成できます。

JSONファイルと組み合わせ技

せっかくJSONファイルも生成したので、これも使ってみましょう。

先ほどのコードに以下を追記します。

gulp.task('json', ['sketch'], function(){
    var dataJson = require('./dist/img/data.json');
    var data = dataJson['sample.sketch'].Page.artbord['artbord.png'];

    console.log('名前:' + data.name);
    console.log('横幅:' + data.width);
    console.log('縦幅:' + data.height);
});

そうすると、gulp jsonコマンドを叩くと、コンソールに

名前:artbord
横幅:152
縦幅:152

と表示されます。

JSONをうまく利用することで、Sketchファイルだけで、ID名、Class名や、またJavaScriptやCSSに値を管理し渡すということも可能になってきます。

最後に

今まで、Sketchはデザイナーが触るものというイメージがありましたが、エンジニアにも入りやすいようにツールを提供しているのがいいですね。

今回は出来ることが少し限られていましたが、将来的にSketchでデザインしたものを、自動的にコーディングしてくれるような未来がちょっと覗けたような気がしています。

今後も機能が充実していくといいですね!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした