🔨

Zenn CLIで記事・本を管理する方法

2020/09/06に公開
41

このページでは Zenn CLI の使い方とコマンドの一覧を紹介します。まだインストールしていない方は下記のリンク先をご覧ください。

📘 Zenn CLI を導入する →

CLI で記事(article)を管理する

ファイルの配置ルール

1 つの記事の内容は、1 つのmarkdownファイル(◯◯.md)で管理します。ファイルはarticlesという名前のディレクトリ内に含める必要があります。

.
└─ articles
   ├── example-article1.md
   └── example-article2.md

具体的な例としてZenn のドキュメント用リポジトリを見ると分かりやすいかもしれません。

記事の作成

以下のコマンドによりmarkdownファイルを簡単に作成できます。

$ npx zenn new:article

articles/ランダムなslug.mdというファイルが作成されます。slug(スラッグ)はその記事のユニークな ID のようなものです。詳しくは「Zenn の slug とは」をご覧ください。

作成されたファイルの中身は次のようになっています。

---
title: "" # 記事のタイトル
emoji: "😸" # アイキャッチとして使われる絵文字(1文字だけ)
type: "tech" # tech: 技術記事 / idea: アイデア記事
topics: [] # タグ。["markdown", "rust", "aws"]のように指定する
published: true # 公開設定(falseにすると下書き)
---
ここから本文を書く

👆 ファイルの上部には---に挟まれる形で記事の設定(Front Matter)が含まれています。ここに記事のタイトル(title)やトピックス(topics)などをyaml 形式で指定することになります。

コマンド実行時に記事の Front Matter をオプションで指定することもできます。

$ npx zenn new:article --slug 記事のスラッグ --title タイトル --type idea --emoji
本文に画像を挿入するには

以下のいずれかの方法で本文に画像を挿入できます。

  1. Zennの画像のアップロードページ(要ログイン)から画像をアップロードしてURLを貼り付ける
  2. GitHubリポジトリ内に画像を配置する
  3. Gyazoなどの外部サービスにアップロードした画像のURLを貼り付ける

プレビューする

本文の執筆は、ブラウザでプレビューしながら確認できます。ブラウザでプレビューするためには次のコマンドを実行します。

$ npx zenn preview # プレビュー開始

👆 このように各記事をプレビューをしながら執筆できます。

記事を公開する

記事を zenn.dev 上で公開するにはpublishedオプションがtrueになっていることを確認したうえで、ファイルをコミットし、Zenn と連携されている GitHub リポジトリにプッシュします。
Zenn と連携したリポジトリの登録ブランチにプッシュされると、同期(デプロイ)が開始されます。

なおコミットメッセージに[ci skip]もしくは[skip ci]が含まれていると Zenn でのデプロイがスキップされます。

日時を指定して記事を公開する(公開予約する)

公開時間を指定して記事を公開するには、Front Matterにて publishedtrue にした上で、 published_at を指定します。published_at のフォーマットは、 YYYY-MM-DD または YYYY-MM-DD hh:mm です。日付だけを指定した場合、時刻は 00:00 となります。

published: true # trueを指定する
published_at: 2050-06-12 09:03 # 未来の日時を指定する

この状態で、GitHubリポジトリへプッシュすると、zenn.dev上で記事が公開予約状態となり、公開予約時刻が過ぎると自動的に記事が公開されます。

過去の公開日時で記事を公開する

他のブログサービスなどからzenn.devに記事を移行する際に公開日時を維持したい場合、Front Matterにて published_at に過去の日時を指定することで、zenn.dev上での公開日時を指定することができます。published_at のフォーマットは、 YYYY-MM-DD または YYYY-MM-DD hh:mm です。日付だけを指定した場合、時刻は 00:00 となります。

published: true # true/falseどちらでもOKです
published_at: 2010-01-01 08:00 # 過去の日時を指定する

記事の更新

記事の更新を行う場合も、markdownファイルを編集し、GitHub リポジトリへプッシュするだけで OK です。このとき slug が同一のものでないと別の記事として作成されてしまうので注意しましょう。

記事の削除

削除はダッシュボードから行います。安全のため、articlesディレクトリからmarkdownファイルを削除しても zenn.dev 上では削除はされません。


CLI で本(book)を管理する

Zenn の本は複数のチャプターで構成されます。

本のディレクトリ構成

GitHub リポジトリで本のデータを管理する場合は、次のようなディレクトリ構成にします。

.
├─ articles
└─ books
   └── 本のスラッグ
       ├── config.yaml # 本の設定
       ├── cover.png # カバー画像(JPEGかPNG)
       └── チャプターのスラッグ.md # 各チャプター

具体的には、以下のようになります。

# 具体的な例
books
└── my-awesome-book
    ├── config.yaml
    ├── cover.png
    ├── example1.md
    ├── example2.md
    └── example3.md

👆example1.mdexample2.mdは各チャプターファイルの例です(のちほど詳しく説明します)。

これが 1 冊の本のファイル構成です。複数の本を作成するためには、同様の構成のディレクトリを複数books内に作ることになります。

本の各ファイルの役割

📄 config.yaml

本の設定ファイルです。以下のように記入してください。

title: "本のタイトル"
summary: "本の紹介文"
topics: ["markdown", "zenn", "react"] # トピック(5つまで)
published: true # falseだと下書き
price: 0 # 有料の場合200〜5000
chapters:
  - example1 # チャプター1
  - example2 # チャプター2
  - example3 # チャプター3
  • title : 本のタイトルを入力します
  • summary : 本の紹介文を入力します。これは有料の本であっても公開されます
  • topics : トピック(タグ)を 5 つまで指定します
  • published : 公開する場合はtrueにします
  • price : たとえば本を 1000 円で販売するときはprice: 1000と記載します(200〜5000 の間で 100 円単位で設定する必要があります)
  • chapters : チャプターの並び順を配列で指定します(入れ子には未対応)。ここに指定されなかったチャプターは zenn.dev に同期されません
  • toc_depth : 以下の説明をご覧ください

🚀 目次の表示設定

2020/10/26 から、チャプターごとの目次を表示できるようになりました。デフォルトでは「h1」と「h2」見出しまで目次に表示されます。

config.yamltoc_depth: 0と記載すると各チャプターの目次を非表示にできます。toc_depth: 1とすると「h1」見出しだけが目次に表示されます。この値は03の範囲で指定する必要があります。

※ この値は本全体での設定になります。チャプターごとに別の設定をすることはできません。

🖼️ カバー画像

本のカバー画像(表紙)はcover.pngもしくはcover.jpegというファイル名で配置します。
推奨の画像サイズは幅 500px・高さ 700pxです。他のサイズにした場合も最終的にこのサイズにリサイズされます。

📄 各チャプターのファイル(◯◯.md

各チャプターのファイル名は「a-z0-9、ハイフン-、アンダースコア_の 1〜50 字の組み合わせ」+ .mdとします。この文字列は URL の一部となります。例えばabout.mdのチャプターの URL は/ユーザー名/本のスラッグ/viewer/aboutとなります。

各チャプターのmarkdownファイルには Front Matter でタイトルを指定し、その下に本文を書いていきます。

---
title: "チャプターのタイトル"
---
ここからチャプター本文
本文に画像を挿入するには

以下のいずれかの方法で本文に画像を挿入できます。

  1. Zennの画像のアップロードページ(要ログイン)から画像をアップロードしてURLを貼り付ける
  2. GitHubリポジトリ内に画像を配置する
  3. Gyazoなどの外部サービスにアップロードした画像のURLを貼り付ける

有料の本で一部のチャプターを無料公開する場合はfree: trueを指定してください。本の価格が ¥0(無料)のときはこの設定は無視されます。

---
title: "タイトル"
free: true
---

具体的な例

たとえば、次の 4 つのチャプターファイルを作ったとします。

  • abstract.md
  • results.md
  • introduction.md
  • conclusion.md

表示順はconfig.yamlで指定します。

# config.yaml
...省略...
chapters:
  - introduction
  - results
  - conclusion

👆 zenn.dev 上ではchaptersに配列で指定された順番にチャプターが並ぶことになります。この例の場合「introduction → results → conclusion」の順に並びます。abstract.mdは指定されていないため同期されません。

ファイル名(チャプター番号.slug.md)で並び順を管理することも

config.yamlでチャプターの並び順を指定すると、ディレクトリ内が煩雑になってしまうという場合には、ファイル名で並び順を制御することもできます。

詳しく読む

ファイル名をチャプター番号.slug.mdという形にすると、その順番通りにチャプターが表示されます。

# 具体的な例
books
└── my-awesome-book
    ├── config.yaml
    ├── 1.intro.md
    ├── 2.foo.md
    └── 3.bar.md

この方法でデプロイを行う場合、config.yamlchaptersは空にしておく必要があります。

デプロイ時に以下のようなファイルの読み方をするためです。

  • config.yamlchaptersが指定されている場合 => 指定通りにslug.mdを読みにいく
  • config.yamlchaptersが空の場合 => 番号.slug.mdを読みにいく

関連する GitHub Issue →

本の雛形をコマンドで作成する

本の構成は少し複雑ですが、下記のコマンドを使えば雛形を作成できます。

$ npx zenn new:book
# 本のslugを指定する場合は以下のようにします。
# npx zenn new:book --slug ここにスラッグ

あとは 1 つずつファイルを作成していけば OK です。

本と各チャプターをプレビューする

以下のコマンドにより、ブラウザ上でプレビューしながら執筆できます。

$ npx zenn preview

最大チャプター数

本のチャプターは1冊あたり最大100個まで作成できます。

本の更新

本の更新を行う場合も、ファイルを変更し、GitHub リポジトリへプッシュするだけで OK です。このとき slug(ディレクトリ名)が同一のものでないと別の本として作成されてしまうので注意しましょう。

本の削除

削除はダッシュボードから行います。booksディレクトリからファイルを削除しても zenn.dev 上では削除はされません。

GitHubで編集を提案

Discussion

Yuki TerashimaYuki Terashima

有料で本を出す場合は、管理するリポジトリはプライベートにしておいたほうが良い感じですかね?

Zenn公式Zenn公式

そうですね。有料販売する場合はプライベートリポジトリにされることをおすすめします。

Hidden comment
Hidden comment
Hidden comment
Hidden comment
Nobuo YamashitaNobuo Yamashita

記事に掲載する画像をローカルの articles/ の下に置いたのですが、CLI でプレビューしたときに表示させたいのですが、URLの指定方法がわからないでいます。なにか方法はありますか?.mdファイルはVS Codeで編集して、github連携しています。

OmatsuOmatsu

本のチャプターを更新したいのですが、Zenn.devへ反映されません。
1ヶ月ほど前までは同じ方法で反映されていたと思うのですが、、
どうしたらよいでしょうか?

ダッシュボードには↓のようにリポジトリ内のファイルが取得できませんでした。articlesディレクトリが存在しているか確認してくださいと表示されます。

https://twitter.com/o_matsu555/status/1327876352356204544?s=20

Zenn公式Zenn公式

GitHubのアカウントはhttps://github.com/ryosuke-mで合っていますか?画像を見る限り、https://github.com/ryosuke-m/zenn-contentsからデータを取得しようとしていると思うのですがhttps://github.com/ryosuke-mというGitHubアカウント自体が存在していないようです。

ダッシュボード - デプロイの下部から「連携を解除する」を実行してもらって、再連携してみていただけますか?
※再連携してもデータは残ります。

OmatsuOmatsu

早速ありがとうございます!!再連携すると無事に更新が反映されました。
先日githubのアカウント名を変更していたことを忘れていました。大変失礼しました。

Hidden comment
Hidden comment
Hidden comment
UmuUmu

本の読者コミュニティ機能について、どこかに説明はありますか?
いろいろと調べてみたのですが、見つけられませんでした。

Hidden comment
Takei KazuyaTakei Kazuya

記事内で明示されていなさそうなので質問なのですが、published_at設定する公開日時のタイムゾーンはどこになりますか?

Zenn公式Zenn公式

ご指摘いただきありがとうございます。 published_at のタイムゾーンは日本(JST)になります。

Takei KazuyaTakei Kazuya

回答ありがとうございます。
JST(Asia/Tokyo)ということで、「タイムゾーンに関して強く意識しておかなくても良い」ことが分かり安心しました。

nanato12nanato12

ディレクトリを深くすることは可能でしょうか?

$ tree -a zenn/
zenn/
├── .gitignore
├── README.md
├── articles
│   └── .keep
└── books
    └── .keep

3 directories, 4 files

のように zenn ディレクトリ配下に設置したいです。
用途としては、別のサイトのmdも一つのリポジトリで管理したいためです。

不可能な場合、今度実装する予定はありますでしょうか?

Zenn公式Zenn公式

zenn-cli のインストール先ディレクトリを zenn/ 配下にすれば可能かと思います。zenn/ ディレクトリで npm install zenn-cli するイメージです。

nanato12nanato12

その方法ですと、ルートディレクトリにarticles, booksが配置されないので、記事がデプロイされないと思います。

元コメントに添付した画像のように、です。

GitHub連携にサブディレクトリ指定のような設定があればいいのですが。

Zenn公式Zenn公式

失礼しました、たしかに仰るとおりですね。元のご質問については「できない」という回答になります。

GitHub連携にサブディレクトリ指定のような設定があればいい

そうですね。こちら検討してみます。ありがとうございます。こちらのISSUEで管理させてください。
https://github.com/zenn-dev/zenn-community/issues/645