update build and package commands
to use output argument or environment variable
This commit is contained in:
parent
0528501f07
commit
825e1e5a29
49
README.md
49
README.md
|
@ -4,7 +4,7 @@ This is a cli tool for the shulkerscript language. It can be used to initialize
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
```bash
|
```bash
|
||||||
cargo install --git https://github.com/moritz-hoelting/shulkerscript
|
cargo install --git https://github.com/moritz-hoelting/shulkerscript-cli
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
@ -13,10 +13,55 @@ cargo install --git https://github.com/moritz-hoelting/shulkerscript
|
||||||
```bash
|
```bash
|
||||||
shulkerscript init [OPTIONS] [PATH]
|
shulkerscript init [OPTIONS] [PATH]
|
||||||
```
|
```
|
||||||
Where [PATH] is the path of the folder to initialize in [default: .]
|
Where [PATH] is the path of the folder to initialize in [default: `.`]
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
- `--name <NAME>` The name of the project
|
- `--name <NAME>` The name of the project
|
||||||
- `--description <DESCRIPTION>` The description of the project
|
- `--description <DESCRIPTION>` The description of the project
|
||||||
- `--pack-format <PACK_FORMAT>` The pack format version
|
- `--pack-format <PACK_FORMAT>` The pack format version
|
||||||
- `--force` Force initialization even if the directory is not empty
|
- `--force` Force initialization even if the directory is not empty
|
||||||
|
|
||||||
|
### Build a project
|
||||||
|
```bash
|
||||||
|
shulkerscript build [OPTIONS] [PATH]
|
||||||
|
```
|
||||||
|
Where [PATH] is the path of the project folder to build [default: `.`]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- `--output <OUTPUT>` The output directory, overrides the `DATAPACK_DIR` environment variable
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
- `DATAPACK_DIR` The output directory [default: `./dist`]
|
||||||
|
|
||||||
|
### Clean the output directory
|
||||||
|
```bash
|
||||||
|
shulkerscript clean [OPTIONS] [PATH]
|
||||||
|
```
|
||||||
|
Where [PATH] is the path of the project folder to clean [default: `.`]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- `--output <OUTPUT>` The output directory, overrides the `DATAPACK_DIR` environment variable
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
- `DATAPACK_DIR` The output directory [default: `./dist`]
|
||||||
|
|
||||||
|
### Package a project
|
||||||
|
```bash
|
||||||
|
shulkerscript package [OPTIONS] [PATH]
|
||||||
|
```
|
||||||
|
Where [PATH] is the path of the project folder to package [default: `.`]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
- `--output <OUTPUT>` The output directory, overrides the `DATAPACK_DIR` environment variable
|
||||||
|
|
||||||
|
Environment variables:
|
||||||
|
- `DATAPACK_DIR` The output directory [default: `./dist`]
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Pull requests are welcome. For major changes, please open an issue first
|
||||||
|
to discuss what you would like to change.
|
||||||
|
|
||||||
|
Please make sure to update tests as appropriate.
|
||||||
|
|
||||||
|
**Note that this repository only contains the cli tool for interfacing with the language. The language itself is located in the [shulkerscript-lang](https://github.com/moritz-hoelting/shulkerscript-lang) repository. Please indicate if pull requests for this repository require pull requests for the language repository**
|
|
@ -16,46 +16,31 @@ pub struct BuildArgs {
|
||||||
/// The path of the project to build.
|
/// The path of the project to build.
|
||||||
#[clap(default_value = ".")]
|
#[clap(default_value = ".")]
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
|
/// The path of the directory to place the compiled datapack.
|
||||||
|
#[clap(short, long)]
|
||||||
|
pub output: Option<PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn build(_verbose: bool, args: &BuildArgs) -> Result<()> {
|
pub fn build(_verbose: bool, args: &BuildArgs) -> Result<()> {
|
||||||
let path = args.path.as_path();
|
let path = args.path.as_path();
|
||||||
|
let dist_path = args
|
||||||
|
.output
|
||||||
|
.clone()
|
||||||
|
.or_else(|| env::var("DATAPACK_DIR").ok().map(PathBuf::from))
|
||||||
|
.unwrap_or_else(|| path.join("dist"));
|
||||||
|
|
||||||
print_info(&format!(
|
print_info(&format!(
|
||||||
"Building project at {}",
|
"Building project at {}",
|
||||||
path.absolutize()?.display()
|
path.absolutize()?.display()
|
||||||
));
|
));
|
||||||
|
|
||||||
let toml_path = if !path.exists() {
|
// env::set_current_dir(
|
||||||
print_error("The specified path does not exist.");
|
// toml_path
|
||||||
return Err(Error::PathNotFoundError(path.to_path_buf()))?;
|
// .parent()
|
||||||
} else if path.is_dir() {
|
// .expect("Failed to get parent directory of pack.toml"),
|
||||||
let toml_path = path.join("pack.toml");
|
// )?;
|
||||||
if !toml_path.exists() {
|
|
||||||
print_error("The specified directory does not contain a pack.toml file.");
|
|
||||||
Err(Error::InvalidPackPathError(path.to_path_buf()))?;
|
|
||||||
}
|
|
||||||
toml_path
|
|
||||||
} else if path.is_file()
|
|
||||||
&& path
|
|
||||||
.file_name()
|
|
||||||
.ok_or(Error::InvalidPackPathError(path.to_path_buf()))?
|
|
||||||
== "pack.toml"
|
|
||||||
{
|
|
||||||
path.to_path_buf()
|
|
||||||
} else {
|
|
||||||
print_error("The specified path is neither a directory nor a pack.toml file.");
|
|
||||||
return Err(Error::InvalidPackPathError(path.to_path_buf()))?;
|
|
||||||
};
|
|
||||||
|
|
||||||
env::set_current_dir(
|
let (project_config, toml_path) = get_pack_config(path)?;
|
||||||
toml_path
|
|
||||||
.parent()
|
|
||||||
.expect("Failed to get parent directory of pack.toml"),
|
|
||||||
)?;
|
|
||||||
|
|
||||||
let toml_content = fs::read_to_string(&toml_path)?;
|
|
||||||
let project_config = toml::from_str::<ProjectConfig>(&toml_content)?;
|
|
||||||
|
|
||||||
let script_paths = get_script_paths(
|
let script_paths = get_script_paths(
|
||||||
&toml_path
|
&toml_path
|
||||||
|
@ -66,11 +51,7 @@ pub fn build(_verbose: bool, args: &BuildArgs) -> Result<()> {
|
||||||
|
|
||||||
let compiled = shulkerscript_lang::compile(&script_paths)?;
|
let compiled = shulkerscript_lang::compile(&script_paths)?;
|
||||||
|
|
||||||
let dist_path = toml_path
|
let dist_path = dist_path.join(project_config.pack.name);
|
||||||
.parent()
|
|
||||||
.expect("Failed to get parent directory of pack.toml")
|
|
||||||
.join("dist")
|
|
||||||
.join(project_config.pack.name);
|
|
||||||
|
|
||||||
compiled.place(&dist_path)?;
|
compiled.place(&dist_path)?;
|
||||||
|
|
||||||
|
@ -123,3 +104,37 @@ fn _get_script_paths(path: &Path, prefix: &str) -> std::io::Result<Vec<(String,
|
||||||
Ok(Vec::new())
|
Ok(Vec::new())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the pack config and config path from a project path.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
/// - If the specified path does not exist.
|
||||||
|
/// - If the specified directory does not contain a pack.toml file.
|
||||||
|
pub(super) fn get_pack_config(path: &Path) -> Result<(ProjectConfig, PathBuf)> {
|
||||||
|
let toml_path = if !path.exists() {
|
||||||
|
print_error("The specified path does not exist.");
|
||||||
|
return Err(Error::PathNotFoundError(path.to_path_buf()))?;
|
||||||
|
} else if path.is_dir() {
|
||||||
|
let toml_path = path.join("pack.toml");
|
||||||
|
if !toml_path.exists() {
|
||||||
|
print_error("The specified directory does not contain a pack.toml file.");
|
||||||
|
Err(Error::InvalidPackPathError(path.to_path_buf()))?;
|
||||||
|
}
|
||||||
|
toml_path
|
||||||
|
} else if path.is_file()
|
||||||
|
&& path
|
||||||
|
.file_name()
|
||||||
|
.ok_or(Error::InvalidPackPathError(path.to_path_buf()))?
|
||||||
|
== "pack.toml"
|
||||||
|
{
|
||||||
|
path.to_path_buf()
|
||||||
|
} else {
|
||||||
|
print_error("The specified path is neither a directory nor a pack.toml file.");
|
||||||
|
return Err(Error::InvalidPackPathError(path.to_path_buf()))?;
|
||||||
|
};
|
||||||
|
|
||||||
|
let toml_content = fs::read_to_string(&toml_path)?;
|
||||||
|
let project_config = toml::from_str::<ProjectConfig>(&toml_content)?;
|
||||||
|
|
||||||
|
Ok((project_config, toml_path))
|
||||||
|
}
|
||||||
|
|
|
@ -1,40 +1,78 @@
|
||||||
use std::path::PathBuf;
|
use std::{env, path::PathBuf};
|
||||||
|
|
||||||
use color_eyre::eyre::Result;
|
use color_eyre::eyre::Result;
|
||||||
use path_absolutize::Absolutize;
|
use path_absolutize::Absolutize;
|
||||||
|
|
||||||
use crate::{
|
use crate::terminal_output::{print_error, print_info, print_success};
|
||||||
error::Error,
|
|
||||||
terminal_output::{print_error, print_info},
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Debug, clap::Args, Clone)]
|
#[derive(Debug, clap::Args, Clone)]
|
||||||
pub struct CleanArgs {
|
pub struct CleanArgs {
|
||||||
/// The path of the project to clean.
|
/// The path of the project to clean.
|
||||||
#[clap(default_value = ".")]
|
#[clap(default_value = ".")]
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
|
/// The path of the directory where the compiled datapacks are placed.
|
||||||
|
#[clap(short, long)]
|
||||||
|
pub output: Option<PathBuf>,
|
||||||
|
/// Clean the whole output folder
|
||||||
|
#[clap(short, long)]
|
||||||
|
pub all: bool,
|
||||||
|
/// Force clean
|
||||||
|
#[clap(short, long)]
|
||||||
|
pub force: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn clean(_verbose: bool, args: &CleanArgs) -> Result<()> {
|
pub fn clean(verbose: bool, args: &CleanArgs) -> Result<()> {
|
||||||
let path = args.path.as_path();
|
let path = args.path.as_path();
|
||||||
|
let dist_path = args
|
||||||
|
.output
|
||||||
|
.clone()
|
||||||
|
.or_else(|| env::var("DATAPACK_DIR").ok().map(PathBuf::from))
|
||||||
|
.unwrap_or_else(|| path.join("dist"));
|
||||||
|
|
||||||
|
let mut delete_paths = Vec::new();
|
||||||
|
|
||||||
|
let (project_config, _) = super::build::get_pack_config(path)?;
|
||||||
|
|
||||||
|
if args.all {
|
||||||
|
if args.force {
|
||||||
|
delete_paths.push(dist_path.clone());
|
||||||
|
} else {
|
||||||
|
print_error("You must use the --force flag to clean the whole output folder.")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
delete_paths.push(dist_path.join(&project_config.pack.name));
|
||||||
|
delete_paths.push(dist_path.join(project_config.pack.name + ".zip"));
|
||||||
|
}
|
||||||
|
|
||||||
print_info(&format!(
|
print_info(&format!(
|
||||||
"Cleaning project at {}",
|
"Cleaning project at {}",
|
||||||
path.absolutize_from(path)?.display()
|
path.absolutize_from(path)?.display()
|
||||||
));
|
));
|
||||||
|
|
||||||
let dist_path = path.join("dist");
|
for delete_path in delete_paths {
|
||||||
|
if delete_path.exists() {
|
||||||
if !path.join("pack.toml").exists() {
|
if verbose {
|
||||||
print_error("The specified directory is not a ShulkerScript project.");
|
print_info(&format!("Deleting {:?}", delete_path));
|
||||||
return Err(Error::InvalidPackPathError(path.to_path_buf()).into());
|
}
|
||||||
|
if delete_path.is_file() {
|
||||||
|
std::fs::remove_file(&delete_path)?;
|
||||||
|
} else {
|
||||||
|
std::fs::remove_dir_all(&delete_path)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if dist_path.exists() {
|
if dist_path.is_dir()
|
||||||
std::fs::remove_dir_all(&dist_path)?;
|
&& dist_path.file_name().is_some_and(|s| s != "datapacks")
|
||||||
|
&& dist_path.read_dir()?.next().is_none()
|
||||||
|
{
|
||||||
|
if verbose {
|
||||||
|
print_info(&format!("Deleting {:?}, as it is empty", dist_path));
|
||||||
|
}
|
||||||
|
std::fs::remove_dir(&dist_path)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
print_info("Project cleaned successfully.");
|
print_success("Project cleaned successfully.");
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,9 @@
|
||||||
use std::fs;
|
use std::{env, path::PathBuf};
|
||||||
|
|
||||||
use color_eyre::eyre::Result;
|
use color_eyre::eyre::Result;
|
||||||
use path_absolutize::Absolutize;
|
use path_absolutize::Absolutize;
|
||||||
|
|
||||||
use crate::{
|
use crate::{error::Error, terminal_output::print_info};
|
||||||
config::ProjectConfig,
|
|
||||||
error::Error,
|
|
||||||
terminal_output::{print_error, print_info},
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::BuildArgs;
|
use super::BuildArgs;
|
||||||
|
|
||||||
|
@ -19,36 +15,19 @@ pub struct PackageArgs {
|
||||||
|
|
||||||
pub fn package(_verbose: bool, args: &PackageArgs) -> Result<()> {
|
pub fn package(_verbose: bool, args: &PackageArgs) -> Result<()> {
|
||||||
let path = args.build_args.path.as_path();
|
let path = args.build_args.path.as_path();
|
||||||
|
let dist_path = args
|
||||||
|
.build_args
|
||||||
|
.output
|
||||||
|
.clone()
|
||||||
|
.or_else(|| env::var("DATAPACK_DIR").ok().map(PathBuf::from))
|
||||||
|
.unwrap_or_else(|| path.join("dist"));
|
||||||
|
|
||||||
print_info(&format!(
|
print_info(&format!(
|
||||||
"Packaging project at {}",
|
"Packaging project at {}",
|
||||||
path.absolutize()?.display()
|
path.absolutize()?.display()
|
||||||
));
|
));
|
||||||
|
|
||||||
let toml_path = if !path.exists() {
|
let (project_config, toml_path) = super::build::get_pack_config(path)?;
|
||||||
print_error("The specified path does not exist.");
|
|
||||||
return Err(Error::PathNotFoundError(path.to_path_buf()))?;
|
|
||||||
} else if path.is_dir() {
|
|
||||||
let toml_path = path.join("pack.toml");
|
|
||||||
if !toml_path.exists() {
|
|
||||||
print_error("The specified directory does not contain a pack.toml file.");
|
|
||||||
Err(Error::InvalidPackPathError(path.to_path_buf()))?;
|
|
||||||
}
|
|
||||||
toml_path
|
|
||||||
} else if path.is_file()
|
|
||||||
&& path
|
|
||||||
.file_name()
|
|
||||||
.ok_or(Error::InvalidPackPathError(path.to_path_buf()))?
|
|
||||||
== "pack.toml"
|
|
||||||
{
|
|
||||||
path.to_path_buf()
|
|
||||||
} else {
|
|
||||||
print_error("The specified path is neither a directory nor a pack.toml file.");
|
|
||||||
return Err(Error::InvalidPackPathError(path.to_path_buf()))?;
|
|
||||||
};
|
|
||||||
|
|
||||||
let toml_content = fs::read_to_string(&toml_path)?;
|
|
||||||
let project_config = toml::from_str::<ProjectConfig>(&toml_content)?;
|
|
||||||
|
|
||||||
let script_paths = super::build::get_script_paths(
|
let script_paths = super::build::get_script_paths(
|
||||||
&toml_path
|
&toml_path
|
||||||
|
@ -59,11 +38,7 @@ pub fn package(_verbose: bool, args: &PackageArgs) -> Result<()> {
|
||||||
|
|
||||||
let compiled = shulkerscript_lang::compile(&script_paths)?;
|
let compiled = shulkerscript_lang::compile(&script_paths)?;
|
||||||
|
|
||||||
let dist_path = toml_path
|
let dist_path = dist_path.join(project_config.pack.name + ".zip");
|
||||||
.parent()
|
|
||||||
.expect("Failed to get parent directory of pack.toml")
|
|
||||||
.join("dist")
|
|
||||||
.join(project_config.pack.name + ".zip");
|
|
||||||
|
|
||||||
compiled.zip(&dist_path)?;
|
compiled.zip(&dist_path)?;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue