Skip to content

Commit fd5fa48

Browse files
authored
Merge pull request #212 from devbasex/release/v3.7.0
release: v3.7.0 base イメージの描画と、名前・見出し・文書の食い違いの解消
2 parents 83d6625 + 95f3221 commit fd5fa48

56 files changed

Lines changed: 6478 additions & 120 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,62 @@
44

55
## [Unreleased]
66

7+
## [3.7.0] - 2026-09-23
8+
9+
### Added
10+
- **base イメージに、Office 文書・PDF を扱う軽量の道具を足しました(PLAN63 / #160)。**
11+
`poppler-utils``pdftoppm` / `pdfinfo` / `pdffonts` / `pdftocairo`)、`python3-pil`
12+
`python3-defusedxml``python3-lxml` で、PDF を画像にする・調べる、OOXML を壊さずに
13+
読み書きすることが base だけでできます。あわせて欧文の metric 互換の
14+
`fonts-crosextra-carlito` / `fonts-crosextra-caladea` を入れ、`Calibri` / `Cambria`
15+
指定が正しい字幅の書体(Carlito / Caladea)へ解決されるようにしました(これまでは
16+
どちらも中国語フォントへ落ちていました)。**LibreOffice と `pip` は入れていません。**
17+
Python パッケージが要るときは既にある `uv` / `uvx` を使ってください。
18+
**反映には `devbase build base --no-cache` が要ります。**
19+
- **名前の形に合わないプロジェクト(`_foo` など)が `projects/` に載る時点で、警告を 1 行出すように
20+
しました(PLAN66 / #203)。** `devbase plugin install` / `update` / `sync` は、プラグインの
21+
プロジェクト・衝突のときに合成する別名 `<名前>.<owner>``projects/` 直下の実ディレクトリの
22+
名前を見ます。`devbase env import` は取り込むプロジェクト名を見て、保存先が `projects/` の外
23+
(age・サーバ backend)ならそのことも知らせます(`--dry-run` でも出ます)。知らせるだけで弾かず、
24+
作られる symlink・ディレクトリと終了コードは変わりません。そうした名前は名前を指定した操作
25+
`devbase up _foo` など)ができず、そのディレクトリの中で名前なしに打てば動きます。
26+
27+
### Changed
28+
- **`devbase scale` が、端末や `.env` に置いた `COMPOSE_PROFILES` を見なくなりました(PLAN65 / #192)。**
29+
`devbase scale` が呼ぶ Compose の子プロセスでも `COMPOSE_PROFILES` を打ち消すようにしたためで、
30+
`COMPOSE_PROFILES` を置いている場合、`devbase scale` はプロファイルのサービスを起動しなくなります。
31+
確定仕様は以前から「`COMPOSE_PROFILES` を端末や `.env` に置いても devbase 経由の操作には効かない」と
32+
定めており、`scale` だけが例外になっていたものを揃えました。プロファイルのサービスを起動するには
33+
`devbase project profile up <名前>` を使ってください。プロファイルを持たないプロジェクトでは、
34+
`devbase scale` が起動の対象にするサービスの集合は変わりません。`devbase login``exec` も同じ
35+
環境を通るようになりましたが、観測できる振る舞いは変わりません。
36+
- **スナップショットの名前が、末尾に改行を持つ値(`abc\n`)を受け付けなくなりました(PLAN66 / #203)。**
37+
スナップショットの名前の検証を、位置引数のプロジェクト名と同じ規則(`utils/names`)へ寄せました。
38+
それ以外に受け付ける名前と、エラーの文言は変わりません。
39+
40+
### Fixed
41+
- **base コンテナで日本語が中国語のフォントで描画される問題を直しました(PLAN63 / #161)。**
42+
総称ファミリ(`sans-serif` / `sans` / `serif` / `monospace`)と、イメージに無い書体名
43+
`Meiryo` / `Yu Gothic` / `MS PGothic` / `Noto Sans JP` など)が、Noto CJK の **JP**
44+
フェイスへ解決されるようになります。これまでは `sans-serif` そのものが中国語フォント
45+
(WenQuanYi Zen Hei)へ解決され、Chromium / Playwright のスクリーンショット・PDF の生成・
46+
画像の生成のすべてが中国語の字形で写っていました。欧文(`Arial` / `Times New Roman` /
47+
`Courier New`)は Liberation の metric 互換のままで、`lang=zh-cn` / `lang=ko` を明示した
48+
指定は、その言語の、しかも同じ様式(sans / serif / 等幅)のフェイスのままです。
49+
**言語を明示しない中国語は日本語の字形で描かれるようになります**(意図した変更です)。
50+
設定は `/etc/fonts/local.conf` に置いており、個人の `~/.config/fontconfig/fonts.conf`
51+
上書きできます。**反映には `devbase build base --no-cache` が要ります。** `devbase up`
52+
だけでは変わらず、派生イメージ(`general` など)を使っているプロジェクトは、その派生
53+
イメージも建て直してください。
54+
- **`group_aliases` のある置き場で、機密の参照の見出しがグループの読み替えの前と後を出すように
55+
しました(PLAN64 / #188)。** `devbase env list` の節の見出しと件数の行、`devbase env backend test`
56+
の参照ごとの行、`devbase env backend migrate` の移行の計画の一覧と `--to age` の完了後の一覧が、
57+
`グローバル(グループ default)` から `グローバル(グループ default → nyle)` になります。これまでは
58+
読み替える前の名前だけが出て、隣に並ぶパス(`devbase/team/nyle/global`)と食い違って見えていました。
59+
読み替えの対応が無いグループ・`version: 1` ・ファイル backend(`plaintext` / `age`)の見出しと、
60+
エラー文言・警告・ログ・`devbase env backend status` の表示は変わりません。置き場のパス・サーバへの
61+
要求・キャッシュにも影響しません。
62+
763
## [3.6.0] - 2026-09-19
864

965
### Added
@@ -694,7 +750,8 @@ OSS 化に伴う初回リリース。devbase は本バージョンより `devbas
694750
### Removed
695751
- 「公式レジストリ」固定の概念を廃止。各レジストリは対等な扱いとなる。
696752

697-
[Unreleased]: https://github.com/devbasex/devbase/compare/v3.6.0...HEAD
753+
[Unreleased]: https://github.com/devbasex/devbase/compare/v3.7.0...HEAD
754+
[3.7.0]: https://github.com/devbasex/devbase/compare/v3.6.0...v3.7.0
698755
[3.6.0]: https://github.com/devbasex/devbase/compare/v3.5.0...v3.6.0
699756
[3.5.0]: https://github.com/devbasex/devbase/compare/v3.4.0...v3.5.0
700757
[3.4.0]: https://github.com/devbasex/devbase/compare/v3.3.0...v3.4.0

containers/base/Dockerfile

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
1919
openssh-client \
2020
curl ca-certificates gnupg lsb-release \
2121
libnss3 libxrandr2 libxss1 \
22-
fonts-noto-cjk fonts-noto-cjk-extra; \
22+
fonts-noto-cjk fonts-noto-cjk-extra \
23+
# 欧文の metric 互換 (Calibri -> Carlito / Cambria -> Caladea)。
24+
# 30-metric-aliases.conf が既に対応を持っており、実体が無いと中国語フォントへ落ちる。
25+
fonts-crosextra-carlito fonts-crosextra-caladea \
26+
# 文書を扱う軽量の道具 (#160)。PDF を画像にする・調べる、OOXML を壊さずに読み書きする。
27+
# LibreOffice (展開 372〜459MB) と pip は入れない。Python パッケージは uv / uvx で賄う。
28+
poppler-utils python3-pil python3-defusedxml python3-lxml; \
2329
# ロケール設定
2430
locale-gen en_US.UTF-8; \
2531
update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8; \
@@ -250,6 +256,19 @@ COPY --chmod=0755 tmux-clean /usr/local/bin/tmux-clean
250256
RUN sudo ln -sf tmux-first /usr/local/bin/tmux1 \
251257
&& sudo ln -sf tmux-clean /usr/local/bin/tmuxc
252258

259+
# フォントの既定。素の fontconfig は sans-serif を中国語フェイス (WenQuanYi Zen Hei) へ
260+
# 向けるため、日本語を描くと中国語の字形で写る (#161)。/etc/fonts/local.conf は
261+
# conf.d/51-local.conf 経由で読まれ、これを中国語へ向けている 64 / 65 より「先」になる。
262+
# conf.d/99-*.conf へ置くと <alias><prefer> が効かない。理由と実測は fonts-local.conf の
263+
# 先頭のコメントにある。利用者は ~/.config/fontconfig/fonts.conf (スロット 50) で上書きできる。
264+
COPY --chmod=0644 fonts-local.conf /etc/fonts/local.conf
265+
266+
# フォントのキャッシュを作り直す。上の Playwright の RUN が --with-deps で
267+
# fonts-wqy-zenhei / fonts-ipafont-gothic / fonts-liberation を入れた「後」でなければ、
268+
# 後から入った書体を知らないキャッシュが残る。直後に ~/.cache を消しているため、
269+
# ここで /var/cache/fontconfig を作り直してコンテナ初回起動時の生成を避ける。
270+
RUN sudo fc-cache -f
271+
253272
# entrypoint と dind
254273
COPY --chmod=755 entrypoint.sh /entrypoint.sh
255274
COPY --chmod=755 dind /usr/local/bin/dind

containers/base/fonts-local.conf

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?xml version="1.0"?>
2+
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
3+
<!--
4+
base コンテナの日本語の描画 (devbasex/devbase#161)
5+
6+
このファイルは /etc/fonts/local.conf へ置く。conf.d/ へ置いてはいけない。
7+
8+
/etc/fonts/fonts.conf は <include>conf.d</include> の 1 行しか持たず、conf.d を番号順に
9+
読む。local.conf は conf.d/51-local.conf 経由で読まれる ── つまりスロット 51 で、
10+
sans-serif を WenQuanYi Zen Hei (中国語) へ向けている 64-wqy-zenhei.conf と
11+
65-nonlatin.conf より「先」である。
12+
13+
<prefer> は一致した総称ファミリの直前へ挿入する (prepend) ため、最も早く読まれた
14+
<prefer> が先頭に残る。効くのは順序が後だからではなく、先だからである。
15+
16+
同じ内容を conf.d/99-devbase-fonts.conf へ置いて実測した結果 (2026-09-22、arm64):
17+
18+
置き場所 fc-match sans-serif fc-match sans-serif:lang=ja
19+
/etc/fonts/local.conf Noto Sans CJK JP Noto Sans CJK JP
20+
/etc/fonts/conf.d/99-devbase-fonts.conf WenQuanYi Zen Hei WenQuanYi Zen Hei
21+
22+
<match target="pattern"> の規則 (下の zh-cn / ko) はどのスロットからでも効くが、
23+
<alias><prefer> は 64 / 65 より先に読まれないと効かない。だから 99 では直らない。
24+
規則の種類によって順序への依存が違うため、「99 でも一部は効く」ことを知らないと、
25+
部分的に直ったのを見て置き場所の問題を見落とす。
26+
27+
利用者は ~/.config/fontconfig/fonts.conf (スロット 50、このファイルより先) で
28+
上書きできる。実測で確認済み。
29+
-->
30+
<fontconfig>
31+
<!-- 総称ファミリの先頭を日本語フェイスにする -->
32+
<alias><family>sans-serif</family><prefer><family>Noto Sans CJK JP</family></prefer></alias>
33+
<alias><family>sans</family><prefer><family>Noto Sans CJK JP</family></prefer></alias>
34+
<alias><family>serif</family><prefer><family>Noto Serif CJK JP</family></prefer></alias>
35+
<alias><family>monospace</family><prefer><family>Noto Sans Mono CJK JP</family></prefer></alias>
36+
37+
<!--
38+
未導入の書体を指定されたときの受け皿 (Meiryo / Yu Gothic / MS PGothic /
39+
Zen Kaku Gothic New など)。弱い結合なので実在する指定は妨げない。Arial は
40+
30-metric-aliases.conf (スロット 30、このファイルより先) の強い結合で
41+
Liberation Sans へ向くため、受け皿は末尾に付くだけで結果を変えない。
42+
-->
43+
<match target="pattern">
44+
<edit name="family" mode="append" binding="weak"><string>Noto Sans CJK JP</string></edit>
45+
</match>
46+
47+
<!--
48+
中国語・韓国語を明示したときは、その言語の、しかも同じ様式のフェイスを保つ。
49+
総称ファミリを名指しした指定にだけ効かせる (<test name="family">)。
50+
51+
この test を省くと、Arial:lang=zh-cn のような欧文の指定まで CJK のフェイスへ
52+
奪われる (binding="strong" の前置は名指しの書体よりも強いため)。実測済み。
53+
様式も崩れる ── serif:lang=zh-cn が sans のフェイスになり、monospace:lang=zh-cn が
54+
等幅でなくなる。だから総称ファミリ 4 つ × 言語 2 つ = 8 つを並べる。
55+
56+
zh-cn は OS 既定の 65-nonlatin.conf と 70-fonts-noto-cjk.conf が正しく扱うので
57+
規則なしでも合うが、ko は合わない (上の <alias> が JP を先頭にするため、韓国語が
58+
日本語の字形になる)。ko だけ書くと非対称で後から読めないため、8 つで対称にする。
59+
-->
60+
<match target="pattern">
61+
<test name="family"><string>sans-serif</string></test>
62+
<test name="lang" compare="contains"><string>zh-cn</string></test>
63+
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK SC</string></edit>
64+
</match>
65+
<match target="pattern">
66+
<test name="family"><string>sans</string></test>
67+
<test name="lang" compare="contains"><string>zh-cn</string></test>
68+
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK SC</string></edit>
69+
</match>
70+
<match target="pattern">
71+
<test name="family"><string>serif</string></test>
72+
<test name="lang" compare="contains"><string>zh-cn</string></test>
73+
<edit name="family" mode="prepend" binding="strong"><string>Noto Serif CJK SC</string></edit>
74+
</match>
75+
<match target="pattern">
76+
<test name="family"><string>monospace</string></test>
77+
<test name="lang" compare="contains"><string>zh-cn</string></test>
78+
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans Mono CJK SC</string></edit>
79+
</match>
80+
81+
<match target="pattern">
82+
<test name="family"><string>sans-serif</string></test>
83+
<test name="lang" compare="contains"><string>ko</string></test>
84+
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK KR</string></edit>
85+
</match>
86+
<match target="pattern">
87+
<test name="family"><string>sans</string></test>
88+
<test name="lang" compare="contains"><string>ko</string></test>
89+
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans CJK KR</string></edit>
90+
</match>
91+
<match target="pattern">
92+
<test name="family"><string>serif</string></test>
93+
<test name="lang" compare="contains"><string>ko</string></test>
94+
<edit name="family" mode="prepend" binding="strong"><string>Noto Serif CJK KR</string></edit>
95+
</match>
96+
<match target="pattern">
97+
<test name="family"><string>monospace</string></test>
98+
<test name="lang" compare="contains"><string>ko</string></test>
99+
<edit name="family" mode="prepend" binding="strong"><string>Noto Sans Mono CJK KR</string></edit>
100+
</match>
101+
</fontconfig>

docs/developer/architecture.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# devbase アーキテクチャ概要
22

3-
devbase v3.6.0 のアーキテクチャ設計と内部構造について説明する。
3+
devbase v3.7.0 のアーキテクチャ設計と内部構造について説明する。
44

55
## 全体構成
66

docs/plugin-dev/compose-profiles.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ dev のほかに app / db などのサービスを持つプロジェクトで、
77
| 項目 | 条件 |
88
| --- | --- |
99
| Docker Compose | **2.20.0 以上**`depends_on``required` を使うため。動作を確かめたのは v5.1.4 |
10-
| devbase | `devbase project profile` があるバージョン |
10+
| devbase | **3.5.0 以上**`devbase project profile` が入った版です(CHANGELOG の `[3.5.0]`)。Plugin として配るなら [`plugin.yml``requires.devbase` も上げます](#plugin-として配るなら-requiresdevbase-を-350-以上へ上げる) |
1111

1212
## 1. `compose.yml` の書き方
1313

@@ -43,6 +43,26 @@ services:
4343

4444
プロファイル名に `__devbase_none__` は使わないでください。devbase が「どのプロファイルも有効にしない」ために予約している名前です。
4545

46+
### Plugin として配るなら `requires.devbase` を 3.5.0 以上へ上げる
47+
48+
`profiles:` を使うプロジェクトを含む Plugin は、`plugin.yml` の `requires.devbase` を
49+
`">=3.5.0"` へ上げてください。`compose.yml` を書き換えたのと同じ Pull Request で上げます。
50+
51+
```yaml
52+
# <plugin>/plugin.yml
53+
requires:
54+
devbase: ">=3.5.0"
55+
```
56+
57+
3.5.0 未満の devbase では、`profiles:` を付けたサービスが `devbase up` の起動対象から外れたまま、
58+
後から起動する手段(`devbase project profile up`)もありません。テスト用サーバ群が黙って起動
59+
しない状態になります。
60+
61+
`requires.devbase` を上げておけば、新規の `devbase plugin install` はその場で拒否され、
62+
`devbase plugin update` では警告が出ます。仕組みは既にあるため、Plugin 側でやることは版数を
63+
書くことだけです。書式(必ずクォートする)と検証の詳細は
64+
[`plugin.yml` リファレンスの `requires`](plugin-yml-reference.md#requires) を参照してください。
65+
4666
## 2. コマンド
4767

4868
```bash

docs/plugin-dev/plugin-yml-reference.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,15 @@ WARNING プラグイン 'carmo-web' は devbase >=4.0.0 を要求しています
169169
devbase 本体を更新してください (この警告を止める場合は DEVBASE_IGNORE_PLUGIN_REQUIRES=1)。
170170
```
171171
172-
> `requires.devbase` を上げるのは、**Plugin が `project.yml` 形式へ移行したタイミング**です。
173-
> 本体の版数と一緒に自動では上がりません。
172+
> **`requires.devbase` は本体の版数と一緒に自動では上がりません。** 上げるのは、**Plugin が
173+
> devbase の新しい機能に依存しはじめたタイミング**です。契機は次のとおりです。
174+
>
175+
> | 契機 | 上げる版数 |
176+
> | --- | --- |
177+
> | Plugin が `project.yml` 形式へ移行した | その形式を読める版 |
178+
> | Plugin のプロジェクトが `compose.yml` に `profiles:` を使う | `">=3.5.0"`([テスト用サーバを後から起動・停止する](compose-profiles.md#plugin-として配るなら-requiresdevbase-を-350-以上へ上げる)) |
179+
>
180+
> どちらも、その機能を使い始めた Pull Request で一緒に上げます。
174181
175182
### `priority`
176183

0 commit comments

Comments
 (0)