☰
mise Forgejo 后端使用指南:从 Codeberg 与自托管 Forgejo 安装预编译二进制
2026/10/12 16:51:06 网站建设 项目流程

mise Forgejo 后端使用指南:从 Codeberg 与自托管 Forgejo 安装预编译二进制

【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise

本篇指南系统讲解 mise 的forgejo后端:如何直接以mise use 'forgejo:user/repo'的形式从 Codeberg 及任意 Forgejo 兼容实例拉取 Release 资产,覆盖认证配置(环境变量、forgejo_tokens.toml、credential_command、fjCLI、git credential fill)与全部工具选项(资产自动匹配、asset_pattern、matching、checksum、bin_path等),并结合本仓库源码说明其实现原理。读完本文,你将能把手头所有通过 Forgejo Release 分发预编译二进制的工具接入 mise 统一管理,并为私有/自托管实例完成安全的认证与资产选择配置。

Forgejo 后端是什么

forgejo是 mise 的内置安装后端之一,专门从Forgejo 兼容仓库的 Release 资产中下载并安装工具。它非常适合那些通过 Forgejo/Codeberg 发布预编译二进制、而不在 GitHub 上发布的项目。

  • 默认使用公共 Codeberg 实例https://codeberg.org,无需任何额外配置即可安装公开仓库;
  • 对于其他 Forgejo 实例(包括自托管实例),通过api_url工具选项指定自定义 API 地址;
  • 识别方式上,forgejo:前缀在 src/backend/backend_type.rs 中被映射为BackendType::Forgejo;
  • 从源码结构看,Forgejo 与 GitHub、GitLab 共享统一的 Git 后端实现(src/backend/mod.rs 中BackendType::Forgejo走github::UnifiedGitBackend::from_arg),因此三者的工具选项与资产匹配逻辑高度一致,资产自动匹配逻辑统一实现在 src/backend/asset_matcher.rs。

基本用法

以 Linux 上的 Forgejo Runner 为例——它发布在自己的 Forgejo 实例上,Release 提供 Linux 二进制。如果你的操作系统不同,请选择一个资产匹配当前平台的工具项目:

mise use 'forgejo:forgejo/runner[api_url=https://code.forgejo.org/api/v1,bin=forgejo-runner]' mise exec -- forgejo-runner --version

注意必须对整个工具参数加引号,否则 shell 的通配符会把方括号当作 glob 语法解析。执行后会在项目配置中写入如下内容:

[tools] "forgejo:forgejo/runner" = { version = "latest", api_url = "https://code.forgejo.org/api/v1", bin = "forgejo-runner", }

给mise use加上-g参数即可安装为全局工具。上述命令完成的是"把 runner 可执行文件安装到 mise 管理目录"这一步骤;将其注册到服务端并作为服务运行,属于独立的后续操作。对于 Codeberg 上的仓库,无需指定api_url。

支持的 Forgejo 语法

  • 最新版本简写:forgejo:user/repo
  • 指定版本简写:forgejo:user/repo@2.40.1

认证

对于私有仓库或需要更高 API 限流配额(rate limit)的场景,mise 支持多种 Forgejo Token 来源。

Token 优先级

mise 按下述顺序依次检查各来源,使用第一个找到的 token:

  1. MISE_FORGEJO_ENTERPRISE_TOKEN(仅对非codeberg.org主机生效)
  2. MISE_FORGEJO_TOKEN
  3. FORGEJO_TOKEN
  4. credential_command(若已设置)
  5. forgejo_tokens.toml(按主机区分)
  6. fjCLI 配置(keys.json,若启用)
  7. git credential fill(若forgejo.use_git_credentials=true)

该优先级顺序与 src/forgejo.rs 中resolve_token(host)的实现一一对应:先读企业级环境变量(且限定非 Codeberg 主机),再读两个标准环境变量,随后依次是credential_command、forgejo_tokens.toml、fjCLI 的keys.json,最后才是git credential fill。同时 src/forgejo.rs 的get_headers只在请求 URL 与api_url同源(相同 origin)时才会附加Authorization: Bearer <token>头——这保证了 token 不会被泄漏给第三方 CDN 或下载域名。

环境变量

export MISE_FORGEJO_TOKEN="forgejo-token"

对于自托管 Forgejo 实例:

export MISE_FORGEJO_ENTERPRISE_TOKEN="forgejo-enterprise-token"

Token 文件(forgejo_tokens.toml)

按主机存放 token,适合在同一台机器上同时使用 Codeberg 与多个企业实例的场景:

# ~/.config/mise/forgejo_tokens.toml [tokens."codeberg.org"] token = "forgejo-public-token" [tokens."forgejo.mycompany.com"] token = "forgejo-enterprise-token"

credential_command

在全局~/.config/mise/config.toml中设置。项目级配置不能设置credential_command。命令只需向 stdout 输出 token 本身:

[settings.forgejo] credential_command = "op read 'op://Private/Forgejo Token/credential'"

mise 使用配置的默认内联 shell 执行该命令。执行时,目标主机名通过环境变量MISE_CREDENTIAL_HOST提供,provider 名称(forgejo)通过MISE_CREDENTIAL_PROVIDER提供。为保持兼容,mise 识别到的 sh 兼容 shell(ash、bash、dash、ksh、sh、zsh)还会把主机名作为$1/${1}传入。

警告:计划中的弃用旧的$1/${1}主机名参数已弃用,请改用MISE_CREDENTIAL_HOST。mise 将在2026.11.0开始发出警告,$1兼容将在2027.11.0移除。

fjCLI 集成

mise 可以把fjCLI 的keys.json作为兜底 token 来源。检查路径依次为:

  1. $XDG_DATA_HOME/forgejo-cli/keys.json(默认~/.local/share/forgejo-cli/keys.json)
  2. ~/Library/Application Support/forgejo-cli.forgejo-cli/keys.json(macOS)
  3. ~/Library/Application Support/Cyborus.forgejo-cli/keys.json(旧版 macOS 路径)

对应源码位于 src/forgejo.rs:Linux/XDG 路径与 macOS 原生路径均会被纳入候选,parse_fj_keys(src/forgejo.rs)解析形如{ "hosts": { "<host>": { "token": "..." } } }的 JSON 结构。

关闭该兜底来源:

[settings.forgejo] fj_cli_tokens = false

git credential fill兜底

作为最后手段,mise 可以查询 git 凭据助手:

[settings.forgejo] use_git_credentials = true

该方式使用git credential fill,支持由 macOS Keychain 等助手存储的凭据。

调试 token 解析

使用mise token forgejo查看 mise 在给定主机下将使用哪个 token:

mise token forgejo mise token forgejo forgejo.mycompany.com

token 诊断信息默认会被掩码(masked)显示。--unmask会打印真实凭据——仅在你确实需要拿到密钥本身时使用,并注意不要将其写入共享日志。该命令实现在 src/cli/token/forgejo.rs,内部调用forgejo::resolve_token,输出形如codeberg.org: a180…61f6 (source: FORGEJO_TOKEN),未命中时输出forgejo.mycompany.com: (none)。

工具选项

以下选项适用于forgejo后端,写在mise.toml的[tools]中,详细定义可参考 docs/dev-tools/index.md。

资产自动匹配(Asset Autodetection)

当未指定asset_pattern时,mise 会自动为你的平台选择最佳资产,评分维度包括:

  • 操作系统兼容性(linux、macos、windows)
  • 架构兼容性(x64、arm64、x86、arm)
  • Libc 变体(Linux 的 gnu 或 musl,Windows 的 msvc)
  • 归档格式偏好(tar.gz、zip 等)
  • 构建类型(避开 debug/test 构建)

对大多数工具,无需指定匹配模式即可直接安装:

mise install forgejo:user/repo

自动匹配逻辑实现在 src/backend/asset_matcher.rs,由 GitHub、GitLab、Forgejo 三个后端共享。

asset_pattern

指定用于匹配 Release 资产名的模式。当同一个 OS/arch 组合下有多个资产、或你需要覆盖自动匹配时使用:

[tools] "forgejo:user/repo" = { version = "latest", asset_pattern = "tool_*_linux_x64.tar.gz" }

matching

将资产选择收窄到名称包含给定子串的条目,同时保留平台自动匹配。与asset_pattern(完全替换自动匹配)不同,matching只缩小候选集——自动匹配仍会从收窄后的列表中选出正确的 OS/arch,因此同一份配置可跨平台保持可移植。

当仓库为每个平台发布多个独立二进制资产、而自动匹配无法区分你要哪一个时,优先使用该选项:

[tools] # 当一个 Release 为每个平台发布多个二进制(如 `mytool-cli` 与 # `mytool-server`)时,matching 可在所有 OS/arch 上选中其一, # 而无需硬编码平台相关的 asset_pattern。 "forgejo:user/repo" = { version = "latest", matching = "mytool-cli" }

工具选项也可以在命令行上以内联[key=value]语法传入:

mise use "forgejo:user/repo[matching=mytool-cli]"

matching是大小写敏感的子串测试,因此当该值同时也是其他资产名的子串时(例如同时发布了tool-*与tool-extras-*,而你设置matching = "tool"),将无法唯一选中目标二进制。需要精确匹配时,改用带锚点的matching_regex。

如果同时设置了asset_pattern,它以asset_pattern为准,matching/matching_regex会被忽略——因为asset_pattern完全替换了自动匹配,候选集已不存在可供收窄的对象。这种忽略是静默的:设置了asset_pattern后,即便matching_regex非法也不会报错,mise 不会对被取代的选项报错。

matching_regex

与matching类似,但要求资产名匹配给定的正则表达式。当子串匹配不够精确时使用。默认大小写敏感;需要忽略大小写时使用内联(?i)标志:

[tools] "forgejo:user/repo" = { version = "latest", matching_regex = "^mytool-cli-" }

如果同时设置了matching与matching_regex,资产必须同时满足两者(逻辑与)才能保留为候选。

警告matching/matching_regex不参与安装路径的生成——安装路径由工具名(user/repo,或tool_alias)和版本决定。要从同一 Release 安装两个二进制,请为每个二进制配置各自的tool_alias,以获得独立的安装目录;重复使用同一个forgejo:user/repo字符串搭配不同matching值会解析到同一目录,第二次安装会覆盖第一次。

version_prefix

为 Release 标签指定自定义版本前缀。默认情况下 mise 能处理常见的v前缀(如v1.0.0),但有些仓库使用release-、version-或其他前缀,甚至完全没有前缀。

配置version_prefix后,mise 会:

  • 过滤可用版本中的该前缀并将其剥离
  • 搜索 Release 时加上该前缀
  • 安装时同时尝试带前缀与不带前缀的版本
[tools] "forgejo:user/repo" = { version = "latest", version_prefix = "release-" }

示例:

  • 设置version_prefix = "release-"时:
    • 用户指定1.0.0→ mise 搜索release-1.0.0标签
    • 可用版本显示为1.0.0(前缀已剥离)
  • 设置version_prefix = ""(空字符串)时:
    • 用户指定1.0.0→ mise 直接搜索1.0.0标签(无前缀)
    • 适用于不使用任何前缀的仓库

prerelease

默认情况下,Forgejo 上标记prerelease: true的 Release 会被排除在mise ls-remote与latest解析之外。设置prerelease = true以包含它们:

[tools] "forgejo:user/repo" = { version = "latest", prerelease = true }

启用后:

  • 预发布标签(如v1.0.0-rc1、v0.1.2-dev.86)会出现在mise ls-remote中
  • latest会解析为稳定版与预发布版中的最新版本,而不是走 Forgejo/repos/{owner}/{repo}/releases/latest快捷接口
  • 模糊版本查询(如1.2)会匹配该前缀下的预发布标签

Draft(草稿)Release 始终被排除。

从源码看,这一行为在 src/forgejo.rs 由list_releases_including_prereleases_from_url支撑:缓存保存"含预发布、不含草稿"的完整列表(is_published_release仅过滤 draft,见 src/forgejo.rs),调用方在读取时按当前prerelease选项决定是否展示。分页方面,如果第一页全是预发布/草稿,mise 会(有上限地)跟随Link头继续翻页寻找稳定 Release(上限MAX_RELEASE_FALLBACK_PAGES = 3,见 src/forgejo.rs),对应测试位于 src/forgejo.rs。

平台特定资产模式

按平台配置不同的资产模式:

[tools."forgejo:user/repo"] version = "latest" [tools."forgejo:user/repo".platforms] linux-x64 = { asset_pattern = "tool_*_linux_x64.tar.gz" } macos-arm64 = { asset_pattern = "tool_*_macOS_arm64.tar.gz" }

checksum

为特定版本与特定产物设置期望的摘要。将下方占位符替换为从可信来源获取的完整 SHA-256 摘要:

[tools."forgejo:owner/repo"] version = "1.0.0" asset_pattern = "tool-1.0.0-x64.tar.gz" checksum = "sha256:REPLACE_WITH_THE_64_HEX_DIGIT_DIGEST"

除了在此指定校验和,也可以使用 mise.lock 来管理校验和。

平台特定校验和

每个平台需要各自的摘要。下列值为占位符;请在安装前从发布方获取真实值,或生成 mise.lock:

[tools."forgejo:user/repo"] version = "1.0.0" [tools."forgejo:user/repo".platforms] linux-x64 = { asset_pattern = "tool_*_linux_x64.tar.gz", checksum = "sha256:REPLACE_WITH_THE_64_HEX_DIGIT_DIGEST", } macos-arm64 = { asset_pattern = "tool_*_macOS_arm64.tar.gz", checksum = "sha256:REPLACE_WITH_THE_64_HEX_DIGIT_DIGEST", }

size

可选地检查期望的字节数。下列数字仅作示意;请使用所选产物的实际大小并固定其版本。大小检查不能验证发布者身份,也不能替代校验和:

[tools] "forgejo:user/repo" = { version = "1.0.0", size = "12345678" }

strip_components

解压归档时剥离的目录层级数:

[tools] "forgejo:user/repo" = { version = "latest", strip_components = 1 }

当strip_components与bin_path均未设置时,若解压后的归档根目录恰好只有一个目录且没有文件,mise 会自动应用strip_components = 1。这在 ripgrep 等把二进制打包在带版本目录里的工具中很常见(如mytool-14.1.0-x86_64-unknown-linux-musl/mytool)。该自动检测确保二进制被直接放到 mise 期望的安装路径中。

bin

将下载的二进制重命名为指定名称。当下载的单个二进制带有平台相关命名时很有用:

[tools."forgejo:user/repo"] version = "2.29.1" bin = "my-tool" # 将下载的二进制重命名为 my-tool

下载单个二进制(非归档)时,mise 会自动去掉文件名中的 OS/arch 后缀。例如docker-compose-linux-x86_64会自动变成docker-compose。仅当你需要特定自定义名称时才使用bin选项。

rename_exe

从归档解压后重命名可执行文件。当归档内的二进制带有平台相关名称时使用:

[tools."forgejo:user/repo"] version = "latest" asset_pattern = "tool_linux.zip" rename_exe = "tool" # 将解压出的二进制重命名为 tool

归档内二进制名不符时用rename_exe;单个二进制下载(非归档)用bin。

no_app

在自动匹配时跳过 macOS.app包资产,优先选择独立的 CLI 二进制。当仓库同时提供 macOS.app包(常见于 Xcode 扩展或 GUI 应用)与独立命令行工具时使用:

[tools."forgejo:user/repo"] version = "latest" no_app = true

当no_app = true时:

  • 自动匹配时包含.app.的资产(如Tool.app.zip、Tool.for.Xcode.app.zip)会被降权
  • 独立归档被优先选择
  • 该选项主要用于 macOS 资产选择;非 macOS 平台上的.app.资产本就已被平台匹配降权
  • 只影响自动匹配;显式指定的asset_pattern值原样使用

bin_path

路径相对于应用strip_components之后的安装目录。设置bin_path会禁用自动根目录剥离。对于形如tool-VERSION/bin/tool的归档,要么保留外层目录并使用bin_path = "tool-{{ version }}/bin",要么同时设置strip_components = 1与bin_path = "bin"。

指定解压归档中包含二进制的目录,或下载文件的放置位置。支持 Tera 模板,可用{{ version }}以及{{ os() }}/{{ arch() }}函数:

[tools."forgejo:user/repo"] version = "latest" strip_components = 0 bin_path = "tool-{{ version }}/bin" # 保留外层 tool-1.0.0 目录

两个函数都接受关键字参数,用于重映射 mise 默认输出的值(os()为linux、macos、windows;arch()为x64、arm64),以适配上游命名不同的目录:

[tools."forgejo:user/repo"] version = "latest" # 展开为 tool-1.0.0-linux-x86_64/bin strip_components = 0 bin_path = 'tool-{{ version }}-{{ os() }}-{{ arch(x64="x86_64", arm64="aarch64") }}/bin'

当模板中包含双引号时,请使用 TOML 单引号字符串,如上例。

注意:不存在裸的{{ os }}/{{ arch }}变量,也没有{{ x86_64_arch }}这类别名——{{ arch(x64="x86_64", arm64="aarch64") }}才是获取这些名称的方式。

二进制路径查找顺序:

  1. 若指定了bin_path,使用该目录
  2. 若未设置bin_path,在安装路径中查找bin/目录
  3. 若安装路径根目录包含可执行文件,使用安装路径根目录
  4. 若不存在bin/目录,在子目录中搜索bin/目录
  5. 若未找到bin/目录,搜索直接子目录中的可执行文件。若在子目录中直接找到可执行文件,该子目录被视为二进制路径
  6. 若未找到可执行文件,使用解压目录的根目录

filter_bins

需要符号链接到过滤后的.mise-bins目录的二进制列表。当工具附带不想暴露到 PATH 的额外二进制时使用:

[tools] "forgejo:user/repo" = { version = "latest", filter_bins = "tool" } "forgejo:user/other-repo" = { version = "latest", filter_bins = ["tool", "helper"] }

启用后:

  • 创建.mise-bins子目录,仅包含指向指定二进制的符号链接
  • 其他二进制(如tool-helper、tool-server)不会暴露到 PATH

api_url

为其他 Forgejo 兼容或自托管实例指定 API 地址。mise 用它列出 Release 与查询 Release 资产;当浏览器下载 URL 不可达或使用自定义/私有实例时,也可能用它下载资产:

[tools] "forgejo:user/repo" = { version = "latest", api_url = "https://forgejo.mycompany.com/api/v1" }

自托管 Forgejo

使用自托管 Forgejo 实例时,设置api_url工具选项,并可选地设置MISE_FORGEJO_ENTERPRISE_TOKEN环境变量用于认证:

export MISE_FORGEJO_ENTERPRISE_TOKEN="your-token"

实现原理:release 列表、缓存与分页

forgejo后端的网络层实现在 src/forgejo.rs:

  • API 形态:列表接口为GET {api_url}/repos/{repo}/releases?limit=100(src/forgejo.rs),单版本接口在latest时走/releases/latest,否则走/releases/tags/{tag}(src/forgejo.rs);
  • 缓存:release 列表与单 release 元数据分别缓存在{CACHE}/forgejo/{key}-releases.msgpack.z与{CACHE}/forgejo/{key}.msgpack.z,新鲜度由fetch_remote_versions_cache设置控制(src/forgejo.rs);
  • 分页:跟随 HTTPLink头中rel="next"翻页;默认在第一页已出现稳定 Release 时停止,仅当设置了MISE_LIST_ALL_VERSIONS或第一页全为预发布/草稿时(受 3 页上限约束)继续翻页(src/forgejo.rs);
  • 鉴权范围:只有与api_url同源的请求才会附加Authorization头(src/forgejo.rs),防止 token 被发送到第三方下载域名;对应测试test_get_headers_only_authenticates_api_origin验证了同源下载 URL 携带、外部域名与 http 地址均不携带的行为。

相关文档

  • 后端总览与通用工具选项:docs/dev-tools/index.md
  • 共享实现的 GitHub 后端(含tool_alias多资产示例):docs/dev-tools/backends/github.md
  • 资产自动匹配逻辑:src/backend/asset_matcher.rs
  • 校验和与锁文件管理:docs/dev-tools/mise-lock.md

【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询