(Translated by https://www.hiragana.jp/)
neue cc - C#による自家製静的サイトジェネレーターに移行した話

C#による自家製じかせい静的せいてきサイトジェネレーターに移行いこうしたはなし

はほとんどわっていませんが(とはいえよこ幅広はばひろくしたので印象いんしょう結構けっこうわったかも)、このサイト、フルリニューアルしました。内部ないぶ構造こうぞうが。完全かんぜんに。別物べつものに。元々もともとはWordPressだったのですが、今回こんかいから自作じさく静的せいてきサイトジェネレーターでhtmlを生成せいせいし、GitHub Pagesでホストするようにしました。もとになるソース(.md)もGitHubじょうき、GitHub ActionsでビルドしてGitHub Pagesでホスティングされるという、完全かんぜんGitHub完結かんけつソリューション。また、記事きじくエディタもGitHub web-based editor(リポジトリのトップで.つと、VS Codeそのものが起動きどうするやつ)を利用りようすることで、非常ひじょう快適かいてきで、というかMarkdownエディタとしては最高さいこう品質ひんしつのものがっかっていて、たかがブログくにしては面倒めんどうくさいPush/Pullもなくダイレクトコミットで反映はんえい出来できてしまうというのがとても体験たいけんになっています。

.でエディタを起動きどうして、articles配下はいかYYYY-MM-DD.mdファイルを新規しんき作成さくせい

image

完全かんぜんにVS Codeそのものでデスクトップアプリのものとまった区別くべつかないレベルで、これをえる品質ひんしつのエディタを普通ふつうのサイトにせることは不可能ふかのうでしょう。当然とうぜんもちろん画像がぞうのプレビューもできますし、なんだったら拡張かくちょうすらはいる。

GitHub管理かんりだと画像がぞう(アップロード)が面倒めんどうくさい問題もんだいがあるのですが、これはIssueを画像がぞうアップローダーとして使つかうことで回避かいひしています。Issueの入力にゅうりょくフォームは、画像がぞうをCtrl+Vでそのままアップロードが可能かのうです。そしてうれしいことに、マークダウンに変換へんかんしてくれているのでコピペするだけでOK。

image

image

がったさきuser-images.githubusercontentべつにIssueそのものとひもいているわけではないので、 アップローダよう使つかったIssueはSubmitすることなくポイ、です。そうしてどこにもひもいていないuser-images.githubusercontentですが、べつにだからといって削除さくじょされることもなく永続えいぞくてきがりつづけているので、遠慮えんりょなく使つかわせてもらうことにします。まぁちゃんとGitHubじょうげてるコンテンツよう使つかっているので、ゆるされるでしょう、きっと。多分たぶん

そうして出来上できあがった記事きじは、そのままエディタじょうのgit UIからコミットすると、自身じしん作業さぎょうしている領域りょういき直接ちょくせつサーバーじょうのmaster(main)なので、プッシュ不要ふよう反映はんえいされます。

image

こうなると、もうWordPressで投稿とうこうをポスト、するのとわらないわけです。ブログ記事きじ程度ていどでcloneしてpullしてstagingしてpushしてというのは地味じみおもたいので、このぐらい身軽みがるきたいですね。(実際じっさい投稿とうこう編集へんしゅうラッシュとかよくあるので、ちょっと手数てかずえるだけで猛烈もうれつ嫌気いやけがさす)

ジェネレートはworkflows/buildy.ymlで、このリポジトリない配置はいちされてるC#プロジェクトを直接ちょくせつビルド/実行じっこうすることで生成せいせい処理しょりをしています。dotnet run便利べんり

build-blog:
runs-on: ubuntu-latest
steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-dotnet@v1
      with:
        dotnet-version: 6.0.x
    - run: dotnet run --project ./src/Blog2/Blog2.csproj -c Release -- ./articles ./publish
    - uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        publish_dir: ./publish
        keep_files: true

生成せいせいされたファイルはpeaceiris/actions-gh-pages使つかってgh-pagesブランチと同期どうきします。そのさい、デフォルトではすでがってるファイルをぜん削除さくじょしてしまうので、今回こんかいはstyleやassetを、同期どうきとはべついてあるので削除さくじょされるとこまるので、keep_files: true指定していしています。そうすると記事きじ削除さくじょがしづらくなるんですが、記事きじ削除さくじょはしない or どうしても削除さくじょしなかったらじゅうに(articlesとgh-pages)削除さくじょすればいいだけ、という運用うんよう回避かいひ

と、いうわけでシステムてきには満足まんぞくです。

C#でもStatiqなどといった静的せいてきサイトジェネレーターは存在そんざいするのですが、あえて自作じさくした理由りゆうは、サイトのシステムをそっくり移行いこうするという都合つごうじょう、URLをまえのものと完璧かんぺきわせたかったというのがあります。生成せいせい結果けっかのファイル一覧いちらん若干じゃっかんへんというかクドいというか、といったところがあるのですが、これはまえのWordPressでやっていたルーティングをそのまんま再現さいげんするためということで。WordPressからのエクスポートも、DB直接ちょくせつてC#でそのままテーブルダンプからつくったので、まぁべつたいしたコードが必要ひつようなわけでもないので一気いっきつくっちゃえというになったというのもあります。

外部がいぶライブラリとしてはMarkdownのHTMLMarkdig採用さいようしました。色々いろいろ高機能こうきのうではあるのですが、今回こんかいMarkdown.ToHtml(input) しか使つかっていませんけれど、感触かんしょくてきにはとてもかったです。

シンタックスハイライトにはPrism.jsもちいました。Markdigの出力しゅつりょくする```csharpの変換へんかんを、とくなに意識いしきせずとも対象たいしょうにしてくれるのがかったですね。プラグインはautoloaderとnormalize-whitespaceをわせて投下とうかしています。

<script src=""https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/components/prism-core.min.js""></script>
<script src=""https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/plugins/autoloader/prism-autoloader.min.js""></script>
<script src=""https://cdnjs.cloudflare.com/ajax/libs/prism/1.25.0/plugins/normalize-whitespace/prism-normalize-whitespace.min.js""></script>

まとめ

最近さいきんブログ投稿とうこうがだいぶってしまっていたのですが、システムも一新いっしんしたことでやるてきたのでいいことです。まぁ本当ほんとうにあんま全然ぜんぜんわってないんですが……!

なお、反映はんえい必要ひつよう所要しょよう時間じかんは30びょうじゃく

image

おそいっちゃあおそいですが、許容きょようできるといえば許容きょようできますね。サイトジェネレートプログラムの実行じっこう時間じかん自体じたいは1びょう以下いかで、べつ全然ぜんぜん時間じかんかかってないんで、CIセットアップとか、それ以外いがい時間じかんなにかとかかっちゃってます。GitHub Actionsの仕組しくてきにしょうがないといえばしょうがないんですが、もうすこしなんとかなってほしいかなあ。あとGitHub Pages自体じたい反映はんえい若干じゃっかんおそい。おそうえ進捗しんちょくからないのが地味じみにストレスフル。とはいえとはいえ、いんじゃあないでしょうか。さのほとんどはGitHub web-based editorからてますね、これは本当ほんとう革命かくめいてきい。というわけで、このweb-based editorをかすシステムをつくっていくという手段しゅだん目的もくてき逆転ぎゃくてんさせた思考しこう最終さいしゅうてき実際じっさいいんじゃないかとおもってます!

Profile

Yoshifumi Kawai

Cysharp, Inc
CEO/CTO

Microsoft MVP for Developer Technologies(.NET)
April 2011
|
July 2025

X:@neuecc GitHub:neuecc

Archive