Skip to main content

local build 用 bash script

注意

以下は万人向けの解説ではなく、私的な忘備録。 環境は Windows11 + miniconda

GitHub で Docusaurus 専用の repository を作成し、Pages の設定を既に済ませているものと想定している。

local build の手順

Git-bash 端末から以下を実行する。

  1. 最初に専用の miniconda 環境に入ってから、作業 directory に cd する。
bash
conda activate docusaurus
cd /c/my_prog/docusaurus/github_page
  1. 記事の追加や編集(blog や docs/UFO などの該当する directory で作業)
  2. ディレクトリを移動。 cd /c/my_prog/docusaurus/github_page
  3. build を実行。 ./make_local_build.sh
  4. local PC の Apache でサイトを確認。

local build 用 bash script

make_local_build.sh
#!/bin/bash
#
# デフォルトのコミットメッセージ
commit_message="fix or add article"


# 疑似リンクの処理
python solv_pseudo_symlink.py
if [ $? -ne 0 ]; then
echo "FAIL: python solv_pseudo_symlink.py"
exit 1
else
echo "PASS: python solv_pseudo_symlink.py"
fi


# コマンドラインオプションの解析
while getopts "m:" opt; do
case $opt in
m)
commit_message=$OPTARG
;;
*)
echo "Usage: $0 [-m commit_message]"
exit 1
;;
esac
done

# ソースファイルに変更があるかを確認
if git diff-index --quiet HEAD --; then
echo "No changes to commit."
exit 0
fi

# ディレクトリが存在する場合、削除する
if [ -d ./build ]; then
rm -rf build
if [ $? -ne 0 ]; then
echo "FAIL: rm -rf build"
exit 1
else
echo "PASS: rm -rf build"
fi
fi

# git add . を実行
git add .
if [ $? -ne 0 ]; then
echo "FAIL: git add ."
exit 1
else
echo "PASS: git add ."
fi

# git commit を実行
git commit -m "$commit_message"
if [ $? -ne 0 ]; then
echo "FAIL: git commit"
exit 1
else
echo "PASS: git commit"
fi

# npm run build を実行
npm run build
if [ $? -ne 0 ]; then
echo "FAIL: npm run build"
exit 1
else
echo "PASS: npm run build"
fi

# deploy_github.sh を続いて実行可能にさせる 兼 更新年月日表示用
date '+%Y-%m-%d %H:%M:%S' >last_update.text

疑似リンク処理用 python script

solv_pseudo_symlink.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# 目的:
# Dodusaurus 用。以下の問題を回避するためのスクリプト。
# このスクリプトを bash スクリプトの中で実行させ、その後に
# git add や git commit, npm run build などを行う。
#
# 実行方法:
# 1. cd /c/my_prog/docusaurus/github_page
# 2. python solv_pseudo_symlink.py
#
# 返り値:
# 0 : 正常終了
# 1 : エラー(コピー元のファイルが存在しなかったなど)
#
# 問題:
# Docusaurus はシンボリックリンクがうまく扱えない。
# 少なくとも windows11 環境では /blog/ の下の md ファイルを
# docs/UFO/ にシンボリックリンクさせると、build してブラウザ
# でみると、タイトル(最初の # 見出し 相当)が欠落する。
# このため、blog 用に作成した markdown 記事を UFO のカテゴリー
# の記事としてシンボリックリンクによって流用することができない。
#
# 対処:
# 擬似的にファイルパスの '.', '/'をそれぞれ "@p", "@s" で置き換えた、
# 疑似リンク用のファイルを作成し、
# この python スクリプトで対応するファイルを上書きコピーする。
#
# 例:
# "touch _sylk_@p@p@s@p@p@sblog@s2024-07-30-a_file.md"
# をたとえば docs/UFO/ の下に作成することで、
# ../../blog/2024-07-030_a_file.md
# を docs/UFO/ の下に上書きコピーする。
#
# 履歴:
# 2024-08-06
# 1. "__syln_" というヘッダーで何度も書き間違いが起きたので "_link_" も許容する。
# 2. "@p@p@s@p@p@sblog@s" が長いので、"@blog@" で代用可能にする。
# 2024-07-11 作成。ChatGPT-4o に作らせたが、そのままでは
# 動かなかったので一部のバグを修正。
#

import os
import shutil
import sys

def decode_path(encoded_path):
if encoded_path.startswith('@blog@'):
return encoded_path.replace('@blog@', '../../blog/')
else:
return encoded_path.replace('@p', '.').replace('@s', '/')

def process_sylk_files(base_dir):
# print(f'{base_dir=}')
for root, dirs, files in os.walk(base_dir):
for file in files:
if file.startswith('_sylk_') or file.startswith('_link_'):
# プレフィックスを除去してエンコードされたパスを取得
encoded_path = file[len('_sylk_'):]
# デコードして相対パスを取得
target_path = decode_path(encoded_path)
target_path_full = os.path.abspath(os.path.join(root, target_path))
# print(f'{root=},{dirs=}, {target_path=}, {target_path_full=}')
if os.path.exists(target_path_full):
destination_path = os.path.join(root, os.path.basename(target_path))
# print(f'{destination_path=}')
# 元のファイルを指定されたディレクトリにコピー
shutil.copy(target_path_full, destination_path)
print(f'Copied {target_path_full} to\n → {destination_path}')
else:
print(f'Target file does not exist: {target_path_full}')
sys.exit(1) # エラーで終了


if __name__ == "__main__":
current_dir = os.getcwd()
process_sylk_files(current_dir)
sys.exit(0) # 正常終了

(2024-07-13)