4个版本
使用旧的Rust 2015
0.1.3 | 2018年5月8日 |
---|---|
0.1.2 | 2018年5月8日 |
0.1.1 | 2018年5月1日 |
0.1.0 | 2018年4月19日 |
#1402 in 数据结构
5MB
586 行
rust_release_artefact: 提取和安装Rust发布工件
仓库: https://gitlab.com/Screwtapello/rust_release_artefact
文档: https://docs.rs/rust_release_artefact
待办事项
- 更新
ExtractedArtefact::new()
以使用walkdir
搜索工件标记文件。 - 是否应该丢弃归档的第一个路径组件,而不是提取它并四处寻找工件元数据呢?
lib.rs
:
从Rust发布工件中安全地提取可安装文件。
简介
Rust工具链的每个新版本都包含多个组件——一些是必需的,一些是可选的——它们可以组合在一起。这些组件以标准格式提供,包括要安装的文件以及描述它们的元数据。因此,安装组件比仅提取存档更复杂,因为并非所有文件都应该放置在目标位置。
这个库解释Rust工件的元数据,并提供它包含的组件列表以及每个组件中可安装文件的特定列表。
下载工件后,使用 ExtractedArtefact::from_tar_gz()
或 ExtractedArtefact::from_tar_xz()
函数提取它并检索元数据(工件来源的地方应该告诉你它的格式)。如果您之前已提取工件,可以直接使用 ExtractedArtefact::new()
重新读取元数据。
第一个示例
extern crate rust_release_artefact as rra;
use std::error;
use std::fs;
use std::io;
use std::path;
fn install_from_tar_gz(
artefact_path: &path::Path,
stage: &path::Path,
component_name: &str,
dest_root: &path::Path,
) -> Result<(), Box<error::Error>> {
// Open the file containing the artefact.
let handle = fs::File::open(artefact_path)?;
// Extract it to the given staging path and read the metadata.
// We're assuming the staging path is already canonicalized, and
// the artefact is in .tar.gz format.
let extracted_artefact = rra::ExtractedArtefact::from_tar_gz(
io::BufReader::new(handle),
stage,
)?;
// Get the requested component from the artefact.
let component = extracted_artefact.components
.get(component_name)
.ok_or("Could not find component")?;
println!(
"Installing component {} version {} to {:?}",
component_name,
extracted_artefact.version,
dest_root,
);
// Install the component into the destination.
// We're also assuming dest_root is already canonicalized.
component.install_to(dest_root)?;
// All done!
Ok(())
}
功能
提取下载的工件
一旦您下载了发布工件,您可以使用 ExtractedArtefact::from_tar_gz()
或 ExtractedArtefact::from_tar_xz()
函数提取它(取决于格式)。
extern crate rust_release_artefact as rra;
use std::fs;
use std::io;
use std::path;
# fn example() -> Result<(), Box<std::error::Error>> {
let handle = fs::File::open("path/to/artefact.tar.gz")?;
// Make sure the staging area exists.
let staging_area = path::Path::new("path/to/staging/area");
fs::create_dir_all(&staging_area)?;
// Canonicalize the staging area path, so Windows can handle long path
// names.
let staging_area = staging_area.canonicalize()?;
let extracted_artefact = rra::ExtractedArtefact::from_tar_gz(
io::BufReader::new(handle),
staging_area,
)?;
# Ok(())
# }
读取工件元数据
结构体 ExtractedArtefact
表示艺术品的元数据,包括该艺术品中的组件以及每个组件中可安装文件的完整列表。
# extern crate rust_release_artefact as rra;
# fn example() -> Result<(), Box<std::error::Error>> {
# let extracted_artefact = rra::ExtractedArtefact::new("src")?;
println!("Version: {:?}", extracted_artefact.version);
println!("Git commit hash: {:?}", extracted_artefact.git_commit_hash);
for (name, component) in &extracted_artefact.components {
println!("Component: {:?} in {:?}", name, component.root);
for path in &component.files {
println!(" - {:?}", path);
}
}
# Ok(())
# }
将组件安装到指定的目的地
结构体 Component
表示艺术品的可安装组件,其文件位于艺术品的暂存区域,准备好安装到目标位置。方便的 Component::install_to()
方法正是如此。
# extern crate rust_release_artefact as rra;
# fn example() -> Result<(), Box<std::error::Error>> {
# let extracted_artefact = rra::ExtractedArtefact::new("src")?;
let component = extracted_artefact.components.get("my-component")
.ok_or("no such component?")?;
// Make sure the destination exists.
let destination = std::path::Path::new("path/to/install/destination");
std::fs::create_dir_all(&destination)?;
// Canonicalize the staging area path, so Windows can handle long path
// names.
let destination = destination.canonicalize()?;
component.install_to(destination)?;
# Ok(())
# }
依赖项
~3–12MB
~152K SLoC