Scoopで管理者権限なしにフォントをインストールすることが出来るbucketを作る



scoopでWindowsの環境構築を目論んでいるのでいて、プログラミング用のフォントファイルもScoop経由でインストールしたかったのですが、公式のBucketには日本語をサポートしているコーディング向け等幅フォント**Source Han code JP**がありません。

そこでGitHubで公開されている非公式Bucketなどを見ていたのですが、フォントのインストールについては、どれも管理者権限が必要なものばかりでした。今回は、管理者権限なしでフォントをインストールしたかったので、自分でbucketを作ることにしました。

なお、本記事ではbucketの作り方については、詳しく説明しないので、[App Manifests · lukesampson/scoop Wiki · GitHub](https://github.com/lukesampson/scoop/wiki/App-Manifests)等を参考にしてください。

## TL;DR

- フォントファイルは、`C:\Users\<Username>\AppData\Local\Microsoft\Windows\Fonts`に置く
- レジストリは、`HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Fonts`に上記フォントファイルのパスを追加する

## フォントファイルのコピー先

Windowsでフォントをインストールする場合、全ユーザで使えるフォントファイルは`C:\Windows\Fonts`に置く必要がありますが、その時に管理者権限が必要です。ログインユーザのみで、使用できれば良い場合は、インストール先に`C:\Users\<Username>\AppData\Local\Microsoft\Windows\Fonts`が使えます。こちらの場合は管理者権限が不要なので、Scoopでminifestを作る時に、`installer`でフォントファイルをこちらにコピーするよう記載します。

なので、今回の注意点としては、scoopの実行ユーザしかインストールしたフォントが使えません。

## レジストリの登録

フォントファイルを、`C:\Users\<Username>\AppData\Local\Microsoft\Windows\Fonts`に置いただけでは、フォントは使えません。レジストリに登録する必要があります。よく見る`HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts`では、管理者権限が必要になりつかえません。代わりに`HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Fonts`に書き込みます。**`HKEY_LOCAL_MACHINE(HKLM)`**ではなく、**`HKEY_CURRENT_USER(HKCU)`**を使うのです。こちらは、管理者権限なしで書き込みが可能でした。

また、レジストリに登録する際の値(Value)は、フォントファイル名ではうまくいかず、インストール先のパスを指定することで上手くいきました。

## 作ったmanifestファイル

ということで、上記**フォントファイルのコピー先**と**レジストリの登録**に注意して作った**Source Han code JP**のmanifestがこちらになります。`uninstaller`では、`installer`で実施したことの反対をしているだけで、`C:\Users\<Username>\AppData\Local\Microsoft\Windows\Fonts`からフォントファイルを削除し、レジストリからも削除しています。

```source-han-code-jp.json
{
    "homepage": "https://github.com/adobe-fonts/source-han-code-jp",
    "license": "OFL-1.1",
    
    "version": "2.011",
    "url": "https://github.com/adobe-fonts/source-han-code-jp/archive/2.011R.zip",
    "hash": "0f98beb0a381d9d19067f9b58f65d2dd65c808a3012ac9cb9866e575ad6d2e7f",

    "extract_dir": "source-han-code-jp-2.011R",
    "installer": {
        "script": [
            "Get-ChildItem $dir\\OTF -filter '*.otf' | ForEach-Object {",
            "   $fontdir = \"$env:LocalAppData\\Microsoft\\Windows\\Fonts\"",
            "   New-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts' -Name $_.Name.Replace($_.Extension, ' (TrueType)') -Value \"$fontdir\\$($_.Name)\" -Force | Out-Null",
            "   Copy-Item $_.Fullname -destination \"$fontdir\"",
            "}"
        ]
    },
    "uninstaller": {
        "script": [
            "Get-ChildItem $dir\\OTF -filter '*.otf' | ForEach-Object {",
            "   $fontdir = \"$env:LocalAppData\\Microsoft\\Windows\\Fonts\"",
            "   Remove-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts' -Name $_.Name.Replace($_.Extension, ' (TrueType)') -Force -ErrorAction SilentlyContinue",
            "   Remove-Item \"$fontdir\\$($_.Name)\" -Force -ErrorAction SilentlyContinue",
            "}"
        ]
    }
}
```

## Scoopでインストールする

あとは、作ったmanifestがあるリポジトリを

```terminal
> scoop bucket add my-bucket <location of git repo>
```

で、バケットとして登録し、

```terminal
> scoop install my-source-han-code-jp
```

で、インストールが出来るとおもいます。