QiitaとHexoで同時投稿をするために
QiitaとHexoで同時投稿するには
最初に
これは、あくまで、Qiita over Hexo
であることに注意したい。私が、最初にHexo
で投稿するようになって、のちに、Qiita
で投稿しようとしたため、ディレクトリ階層などは、Hexo
が主軸になる。
HexoとQiitaの概略
どちらもMarkDown形式のファイルを自動化されたcss、javascriptと合わせて、最終的に、htmlに変換するサービスを提供している。npm
パッケージリポジトリにそれらをCLIから操作できる便利なツールが出ているため、先に、npm
使える状況にないよって人は以下を参考にしてね。
私的ArchLinux開発環境構築 >> nvmによるnpm/node環境構築
Hexo
インストール
1 | npm i --save-dev hexo-cli -g |
これを実行した後は、どのディレクトリ階層でも、hexo
コマンドが使えるようになっていると思う。次に、ディレクトリ階層を作っていくが、それを1から構成するのは骨が折れるので、以下を実行し、必要ファイルをhexo
に生成してもらう。
ファイル配置
1 | # 作業ディレクトリを作ってその中で実行する。 |
記事の作成
1 | hexo new "<title>" |
これにより、source/_posts/
内に<title>.md
が追加されるので、それを編集する。
ローカルサーバー起動(テスト)
規定では、http://localhost:4000
で起動される。
1 | hexo server |
カスタマイズ
デプロイヤー
以下、Githubをデプロイ先として考える。
現状、source/_posts/
に*.md
ファイルを配置し、hexo server
をすることで、ローカルでそれらを確認できるが、実際は、リモートで配信するためのプッシュ(デプロイ)が必要になる。別にGithubのワークフローでも自動プッシュが可能。しかし、私はコマンド派。
1 | npm i hexo-deployer-git |
_config.yml
の変更場所
1 | # デプロイ先のレポジトリ名が`<user>.github.io`の場合 |
テーマ
私は、jerryc127/hexo-theme-butterflyを使っている。他にも、テーマはたくさんあるので好みのものを選ぼう。
https://hexo.io/themes/
リンク簡略化〜永久リンクを短くする〜
デフォルトの設定では、投稿後のリンクは、https://<デプロイ先のURL>/2025/04/28/<title>/
となるが、以下を導入することで、https://<デプロイ先URL>/posts/8821/
というURLでアクセスできるようになる。
1 | npm i hexo-abbrlink --save |
_config.yml
1 | permalink: posts/:abbrlink/ |
Qiita(Qiita-CLI)
インストール
1 | npm i @qiita/qiita-cli --save-dev |
これにより、npx
コマンドを経由して、qiita
コマンドが使えるようになった。以下、初回に限り実行するもの。
1 | npx qiita init |
Hexoで作ったmdファイルをQiitaへ投稿するまで
開発での苦難
ここで私は困った。
このqiita
コマンドでは、--root
引数により、ルートディレクトリは設定できるものの、public
ディレクトリは必要なのだ。
一方、hexo
では、*.md
ファイルをsource/_posts/
ディレクトリに配置する。ここをうまいこと統合する必要がある。
そこで、私が、その、hexo
からqiita
への橋渡しとなるバッシュスクリプトを開発した。それが以下である。
deploy_to_qiita.sh
の紹介
deploy_to_qiita.sh
1 |
|
以下、実行時のログ
これにより、Qiitaで投稿する際に必要になる、キーupdated_at;private;id;organization_url_name;slide;ignorePublish;
などがhexo new "<title>"
コマンドで生成されたsource/_posts/
内にある*.md
ファイルに対して、自動で追加され、そのまま投稿・更新できるようになる。
なお、一度、qiita/
ディレクトリを作り、そこに、source/_posts/
内の*.md
ファイルをコピーした後で、sed
コマンドによるファイル操作を行うので、元の*.md
ファイルが汚染されることはない。
最新のdeploy_to_qiita.sh
については、以下を参照してほしい。更新があれば、記事の方も更新するようにするので、同じ内容になるかとは思う。(一応)
https://github.com/verazza/blog/blob/master/deploy_to_qiita.sh
deploy_to_qiita.sh
の簡単な説明と使い方
おおまかな使い方
具体的な使い方を説明しよう。
これは内部で、git diff
コマンドによる、source/_posts
内の*.md
ファイルに差異があれば、それをqiita/public
にコピーして、front-matterを処理するので、git push
する前に、deploy_to_qiita.sh
を実行する必要がある。
投稿前に文字列置換を行いたい場合
また、もし、qiita
投稿時に、特定の*.md
ファイルに対して、文字列置換を行いたい場合は、mapping.sh
をdeploy_to_qiita.sh
と同じ階層に配置すれば、deploy_to_qiita.sh
が自動で読み込んでくれる。今回、それは、ここには掲載はしないが、興味があれば、以下を見てほしい。
https://github.com/verazza/blog/blob/master/mapping.sh
置換だけ行いたい場合は、以下を実行すれば、source/_posts/
内のすべての*.md
ファイル(Git管理化にあるもの)に対して、deploy_to_qiita.sh
を実行できる。
1 | ./deploy_to_qiita.sh force |
今後のdeploy_to_qiita.sh
をどうするか
にしても、git push
する前に、実行しなければいけないというのは、ユーザーエクスペリエンスの観点で良くないと思う。だから、まずは、これをコミット履歴やもしくはデータベースなどを駆使することで、差異があることを確認するなどして、git diff
に依存しない形を取る必要がある。
別途、zenn
にも投稿できるようにしたい。
同時投稿での注意点
Qiita
とHexo
で同時投稿・同時配信するために、画像リンクなどは、おそらく、Qiita
ベースのほうが良い。
理由は、Hexo
での画像表示するときのMARKDOWN形式での書き方は、
というように、ルートに/images
ディレクトリがある前提でpublic/images
に画像を保存するのだが、Qiita
ではそのようなものはサポートされていないためだ。
じゃあ、どうするのかというと、一度、WEBの方で、Qiita
で画像を貼り付けると、https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/
から始まる画像リンクが得られるので、これをHexo
のソースである*.md
ファイルにも貼り付けることで、両方で画像を表示することが可能になる。めんどうだけどね。
いや、そんなことしなくてもいいのだ。文字列置換があれば、例えば、Qiita
にデプロイするときには、/image/sample.png
という文字列をhttps://qiita-image-store.s3.ap-northeast-1.amazonaws.com/
に変換すればいい。すなわち、mapping.sh
にその旨を書けばよい。
package.json
のタスク
以下、参考までに。
1 | "scripts": { |
最後に
今回は、記事作成および投稿にhexo
を使っていた私がqiita
にも、一応投稿しておくか!ってことで、Qiita-CLI
を使いましたが、良い機会になりました。やっぱコマンド触ってるだけでエンジニアっぽい…
追記:
おそらく、これを応用すれば、zenn
にも投稿できると思うので、またいずれ…
参考
jerryc127/hexo-theme-butterflyテーマを使うときに
https://sj-note.com/hexo-butterfly-upgrade
hexo
の有用プラグインの検索に
https://qiita.com/ORCHESTRA_TAPE/items/a0c795904e33cdf043d7