🔖

defaults, PlistBuddy, plutilをdockerで利用する

2021/12/26に公開

TL;DR

dotfilesの設定に対してテストを実行したかったので、defaults, PlistBuddy, plutilをdockerで動かせるようにしました。

docker run --rm -it --entrypoint bash ghcr.io/xhiroga/defaults-plutil:latest

defaults

GNUstepのおかげで、パッケージをインストールするだけで動かせました。

apt update && apt install gnustep-base-runtime -y

GNUstepやdefaultsの歴史については、拙稿 defaultsの歴史 をご覧ください。

ちなみに、macOS実装とGNUstep実装では細かい挙動の差異があります。

オプションの違い

GNUstepは値の引数に型を取ることができません。macOSの方が充実している印象です。

# macOS
% defaults write com.apple.dock autohide -bool false
% defaults read com.apple.dock autohide
0

# GNUstep
% defaults write com.apple.dock autohide -bool false
% defaults read com.apple.dock autohide
com.apple.dock autohide -bool

違いはそれぞれのマニュアルからも分かります。

GNUstep

defaults write domain key value

write 'value' as default 'key' in the specified domain. 'value' must be a property list in single quotes.

-- <cite>defaults(1) — gnustep-base-runtime — Debian stretch — Debian Manpages</cite>

macOS

Command line interface to a user's defaults.
Syntax:

'defaults' [-currentHost | -host <hostname>] followed by one of the following:

(省略)

write <domain> <domain_rep> writes domain (overwrites existing)
write <domain> <key> <value> writes key for domain

(省略)

<value> is one of:
<value_rep>
-string <string_value>
-data <hex_digits>
-int[eger] <integer_value>
-float <floating-point_value>
-bool[ean] (true | false | yes | no)
-date <date_rep>
-array <value1> <value2> ...
-array-add <value1> <value2> ...
-dict <key1> <value1> <key2> <value2> ...
-dict-add <key1> <value1> ...

Preference Domainの検索パスの違い

macOS実装では ~/Library/Preferences/identifier.plistが検索対象になるのに対して、GNUstep実装をUbuntuで動かした場合は ~/GNUstep/Defaults/identifier.plist が検索対象になります。
(もしかしたらGNUstepをビルドした環境や実行環境によって変わるかもしれません)

PlistBuddy & plutil

クロスプラットフォームな実装が配布されているため、cloneしてbuildすることで動かすことができました。
screenplaydev/plutil: A cross-platform, drop-in replacement for Apple's plutil.

2016年頃にFacebookが発表したxcbuildというXCodeの互換ツールがあり、そのコードを移植したプロジェクトとのことです。

苦労した点

ライブラリが正しくインストールされないバグのため、当初PlistBuddyが動きませんでした。
Issueを起票しつつ、手動でinstallすることで一応解決。

liblinenoise.so was built but not installed. · Issue #6 · screenplaydev/plutil

まとめ

defaultsPlistBuddy, plutil がテストできるようになり、とても嬉しいです。
皆様も充実した dotfiles ライフをお過ごし下さい。

GitHubで編集を提案

Discussion