#channel #release #artefact

rust_release_artefact

安全地从Rust发布工件中提取可安装文件

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 数据结构

MIT/Apache

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