1个不稳定版本
0.1.0 | 2022年2月7日 |
---|
1640 在 游戏开发 中
51 每月下载量
在 7 个Crates(5个直接使用) 中使用
7KB
154 行
国库
国库是一个易于使用的库和工具集,用于为游戏引擎或其他应用程序创建资产管道。
目录
💻 安装
国库提供的应用程序可以使用 cargo
安装。
要安装 treasury-server
,请运行
cargo install treasury-server
要安装 treasury
命令行工具
cargo install treasury-cli
✋ 用法
⚡ 初始化
要开始使用国库,必须创建一个实例。国库实例由 Treasury.toml
文件定义。文件的父目录称为“基本目录”。
此文件可以手动创建 👷 或使用以下方法
-
命令行工具
treasury init
将使用当前目录作为基本目录初始化国库实例。
treasury --base <path> init
将使用基本目录
<path>
初始化国库实例。 -
客户端库API提供了方法
Client::local
。将init
参数设置为true
将初始化国库。这是上述CLI调用内部使用的。
⚡ 配置
默认的 Treasury.toml
文件看起来是这样的
是的,空文件。
有四个字段可以被覆盖。
-
artifacts = "<path>"
将覆盖工件目录到相对于
<base>
指定的路径。默认为<base>/treasury/artifacts
工件目录是存储所有工件的地方。这可以,并且 不应该 被版本控制系统(VCS)覆盖。如果路径在仓库内部,则应该忽略它。如果国库创建工件目录(在存储工件且目录不存在时),它将创建包含“*”的 .gitignore 文件。
-
external = "<path>"
将覆盖外部目录到相对于
<base>
指定的路径。默认为<base>/treasury/external
外部目录是存储所有远程资产元数据文件的目录。此目录 应 存储在仓库中,而不是由 VCS 忽略。
-
temp = "<path>"
将覆盖临时文件的默认目录。默认为
std::env::temp_dir()
的结果。临时文件用作下载并供导入器消耗的源文件的中继存储,以及导入器的输出。 -
importers = ["<list>", "<of>", "<paths>"]
将指定应为此实例使用的导入器库。
Rust 项目通常位于 cargo 工作区的目标目录中。
一旦初始化 Treasury 实例,就可以用来存储和检索资产。
⚡ 存储
在 Treasury 中存储资产很简单。使用 CLI 看起来是这样的
treasury store <source-path> <target-format>
输出中的最后一行将包含 AssetId
,如果存储操作成功。否则将打印错误。
如果源格式不明确,可以在目标格式后指定。
treasury store <source-path> <target-format> <source-format>
要从 URL 存储资产,请使用 --url
(简称 -u
)标志。
treasury store --url <source-url> <target-format> <source-format>
没有此标志,源参数始终解释为文件路径。带有此标志,源参数始终解释为 URL。这也可以是 file:
URL。
使用库 API 存储,使用 treasury_client::Client::store_asset
方法。
存储过程
整个过程可以描述为四个步骤
- 用户提供资产源、最终应用程序将使用的目标格式,以及可选的源格式。只有在不明确的情况下才需要源格式。
- 一个已注册的导入器,它匹配源格式和目标格式,运行并处理资产为工件。
- Treasury 存储结果工件。它避免存储重复项,但不同的资产可能指向同一个工件。
- 返回 AssetId。
⚡ 检索
用户可以使用资产源和目标格式或 AssetId
检索已存储资产的工件。工件应始终使用 AssetId
。当资产源迁移时,.treasury 文件应随之迁移。在这种情况下,不需要重新导入,并且它们的 AssetId
会被保留。
⚡ 导入器
为了存储资产,需要一个导入器将资产源 🥚 转换为工件 🐤。
导入器是实现 treasury_import::Importer
特性的类型。
Treasury 可以配置为从动态库中加载导入器。
为了简化编写导入器库并最小化由无效实现引起的问题,应使用 treasury_import::make_treasury_importers_library
宏。
此宏将导出服务器预期需要的所有符号。它将确保使用 treasury_import
crate 的主要版本进行 ABI 兼容性。该宏及其生成的代码将执行所有不安全的操作,从而为导入器库的作者留下简单且 100% 安全的 Rust。
示例导入器
基本的导入器库可能看起来像这样
# Cargo.toml
[package]
name = "my-importer"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["cdylib"]
[dependencies]
treasury-import = { path = "../../import" }
//! src/lib.rs
struct MyImporter;
impl treasury_import::Importer for MyImporter {
fn import(
&self,
source: &std::path::Path,
output: &std::path::Path,
_sources: &impl treasury_import::Sources,
_dependencies: &impl treasury_import::Dependencies,
) -> Result<(), treasury_import::ImportError> {
match std::fs::copy(source, output) {
Ok(_) => Ok(()),
Err(err) => Err(treasury_import::ImporterError::Other { reason: "SOMETHING WENT WRONG".to_owned() }),
}
}
}
// Define all required exports.
treasury_import::make_treasury_importers_library! {
// [extensions list] <name> : <source-format> -> <target-format> = <expr>;
// <expr> must have type &'static I where I: Importer
// Use `Box::leak(importer)` if importer instance cannot be constructed in constant expression.
[foo] foo : foo -> foo = &FooImporter;
}
导入过程中产生的工件应始终使用 AssetId
来引用依赖。资产源文件可以包含路径(相对于源文件或绝对路径)或URL,可以通过 Dependencies
容易地将其转换为 AssetId
。如果依赖项未找到,应返回 ImportResult::RequireDependencies { ... }
。存储过程将尝试存储依赖项并重试导入。
缺少什么?
目前该项目是资产管道的简化实现。
- 打包功能尚未实现。必须有一种方法可以将工件子集打包到优化用于磁盘存储和无需间接引用的包中。
- 服务器尚未准备好用于远程模式。为此,服务器应能够从请求存储操作的客户那里获取本地源数据。
- 目前仅支持
file:
和data:
URL。这对于处理本地资产足够了。 - 🔥 热重载 🔥 目前不可用,因为服务器没有监视 👀 源文件中的更改。
许可证
许可协议为以下之一
- Apache License,版本 2.0,(license/APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可协议(license/MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确表示,否则您根据 Apache-2.0 许可协议提交的任何有意提交以包含在作品中的贡献,将根据上述条款双重许可,没有任何附加条款或条件。
依赖项
~0.4–1MB
~23K SLoC