Merge pull request #10 from mrxiaozhuox/master

Update `Dioxus.toml` and fixed some problem
This commit is contained in:
Jonathan Kelley authored and GitHub committed 2022-02-17 11:27:37 -05:00
commit 4815fe33f9
7 files changed
+137 -53

No files matched your search

+34 -10
View File
@@ -1,18 +1,10 @@
<div align="center"> <div align="center">
<h1>📦✨ dioxus-cli </h1> <h1>📦✨ dioxus-cli </h1>
<p> <p><strong>Tooling to supercharge dioxus projects</strong></p>
<strong>Tooling to supercharge dioxus projects</strong>
</p>
</div> </div>
![Dioxus Logo](https://dioxuslabs.com/guide/images/dioxuslogo_full.png)
# About
dioxus-cli (inspired by wasm-pack and webpack) is a tool to help get dioxus projects off the ground. It handles all the build, development, bundling, and publishing to make web development simple. dioxus-cli (inspired by wasm-pack and webpack) is a tool to help get dioxus projects off the ground. It handles all the build, development, bundling, and publishing to make web development simple.
## Installation ## Installation
```shell ```shell
@@ -24,4 +16,36 @@ $ cargo install --git https://github.com/DioxusLabs/cli
$ cargo install --path . --debug $ cargo install --path . --debug
``` ```
Now, `dioxus` is in your path. Now, `dioxus` is in your path, you can use `dioxus --help` to get the help document.
```
dioxus 0.1.2
Build, bundle, & ship your Dioxus app
USAGE:
dioxus.exe [FLAGS] <SUBCOMMAND>
FLAGS:
-h, --help Prints help information
-v Enable verbose logging
-V, --version Prints version information
SUBCOMMANDS:
build Build the Rust WASM app and all of its assets
clean Clean output artifacts
config Dioxus config file controls
create Init a new project for Dioxus
help Prints this message or the help of the given subcommand(s)
serve Build, watch & serve the Rust WASM app and all of its assets
translate Translate some source file into Dioxus code
```
## Get Started
You can use the `dioxus crate project_name` to init a dioxus project, its will be clone from the [dioxus-template](https://github.com/DioxusLabs/dioxus-template).
or you can assign the template path:
```
dioxus create hello --template gh:dioxuslabs/dioxus-template
```
+8 -7
View File
@@ -1,23 +1,24 @@
[application] [application]
# App (Project) Name # dioxus project name
name = "{{project-name}}" name = "{{project-name}}"
# Dioxus App Support Platform # default platfrom
# desktop, web, mobile, ssr # you can also use `dioxus serve/build --platform XXX` to use other platform
platforms = ["web"] # value: web | desktop
default_platform = "web"
# Web `build` & `serve` dist path # Web `build` & `serve` dist path
out_dir = "dist" out_dir = "dist"
# resource (static) file folder
asset_dir = "public"
[web.app] [web.app]
# HTML title tag content # HTML title tag content
title = "dioxus | ⛺" title = "dioxus | ⛺"
# resource (static) file folder
public_dir = "public"
[web.watcher] [web.watcher]
watch_path = ["src"] watch_path = ["src"]
+57 -19
View File
@@ -5,6 +5,7 @@ use crate::{
}; };
use std::{ use std::{
fs::{copy, create_dir_all, remove_dir_all}, fs::{copy, create_dir_all, remove_dir_all},
panic,
path::PathBuf, path::PathBuf,
process::Command, process::Command,
}; };
@@ -21,7 +22,7 @@ pub fn build(config: &CrateConfig) -> Result<()> {
out_dir, out_dir,
crate_dir, crate_dir,
target_dir, target_dir,
public_dir, asset_dir,
executable, executable,
dioxus_config, dioxus_config,
.. ..
@@ -60,9 +61,6 @@ pub fn build(config: &CrateConfig) -> Result<()> {
// [2] Establish the output directory structure // [2] Establish the output directory structure
let bindgen_outdir = out_dir.join("assets").join("dioxus"); let bindgen_outdir = out_dir.join("assets").join("dioxus");
// [3] Bindgen the final binary for use easy linking
let mut bindgen_builder = Bindgen::new();
let release_type = match config.release { let release_type = match config.release {
true => "release", true => "release",
false => "debug", false => "debug",
@@ -78,17 +76,27 @@ pub fn build(config: &CrateConfig) -> Result<()> {
.join(format!("{}.wasm", name)), .join(format!("{}.wasm", name)),
}; };
bindgen_builder let bindgen_result = panic::catch_unwind(move || {
.input_path(input_path) // [3] Bindgen the final binary for use easy linking
.web(true)? let mut bindgen_builder = Bindgen::new();
.debug(true)
.demangle(true)
.keep_debug(true)
.remove_name_section(false)
.remove_producers_section(false)
.out_name(&dioxus_config.application.name)
.generate(&bindgen_outdir)?;
bindgen_builder
.input_path(input_path)
.web(true).unwrap()
.debug(true)
.demangle(true)
.keep_debug(true)
.remove_name_section(false)
.remove_producers_section(false)
.out_name(&dioxus_config.application.name)
.generate(&bindgen_outdir).unwrap();
});
if bindgen_result.is_err() {
log::error!("Bindgen build failed! \nThis is probably due to the Bindgen version, dioxus-cli using `0.2.79` Bindgen crate.");
}
// this code will copy all public file to the output dir
let copy_options = fs_extra::dir::CopyOptions { let copy_options = fs_extra::dir::CopyOptions {
overwrite: true, overwrite: true,
skip_exist: false, skip_exist: false,
@@ -97,8 +105,8 @@ pub fn build(config: &CrateConfig) -> Result<()> {
content_only: false, content_only: false,
depth: 0, depth: 0,
}; };
if public_dir.is_dir() { if asset_dir.is_dir() {
for entry in std::fs::read_dir(&public_dir)? { for entry in std::fs::read_dir(&asset_dir)? {
let path = entry?.path(); let path = entry?.path();
if path.is_file() { if path.is_file() {
std::fs::copy(&path, out_dir.join(path.file_name().unwrap()))?; std::fs::copy(&path, out_dir.join(path.file_name().unwrap()))?;
@@ -118,7 +126,7 @@ pub fn build(config: &CrateConfig) -> Result<()> {
Ok(()) Ok(())
} }
pub fn build_desktop(config: &CrateConfig) -> Result<()> { pub fn build_desktop(config: &CrateConfig, is_serve: bool) -> Result<()> {
log::info!("🚅 Running build [Desktop] command..."); log::info!("🚅 Running build [Desktop] command...");
let mut cmd = Command::new("cargo"); let mut cmd = Command::new("cargo");
@@ -144,7 +152,9 @@ pub fn build_desktop(config: &CrateConfig) -> Result<()> {
} }
if output.status.success() { if output.status.success() {
if config.out_dir.is_dir() { // this code will clean the output dir.
// if using the serve, we will not clean the out_dir.
if config.out_dir.is_dir() && !is_serve {
remove_dir_all(&config.out_dir)?; remove_dir_all(&config.out_dir)?;
} }
@@ -179,9 +189,37 @@ pub fn build_desktop(config: &CrateConfig) -> Result<()> {
file_name file_name
}; };
create_dir_all(&config.out_dir)?; if !config.out_dir.is_dir() {
create_dir_all(&config.out_dir)?;
}
copy(res_path, &config.out_dir.join(target_file))?; copy(res_path, &config.out_dir.join(target_file))?;
// this code will copy all public file to the output dir
if config.asset_dir.is_dir() {
let copy_options = fs_extra::dir::CopyOptions {
overwrite: true,
skip_exist: false,
buffer_size: 64000,
copy_inside: false,
content_only: false,
depth: 0,
};
for entry in std::fs::read_dir(&config.asset_dir)? {
let path = entry?.path();
if path.is_file() {
std::fs::copy(&path, &config.out_dir.join(path.file_name().unwrap()))?;
} else {
match fs_extra::dir::copy(&path, &config.out_dir, &copy_options) {
Ok(_) => {}
Err(e) => {
log::warn!("Error copying dir: {}", e);
}
}
}
}
}
log::info!( log::info!(
"🚩 Build completed: [./{}]", "🚩 Build completed: [./{}]",
config config
+10 -2
View File
@@ -19,12 +19,20 @@ impl Build {
crate_config.as_example(self.build.example.unwrap()); crate_config.as_example(self.build.example.unwrap());
} }
match self.build.platform.as_str() { let platform = self.build.platform.unwrap_or_else(|| {
crate_config
.dioxus_config
.application
.default_platform
.clone()
});
match platform.as_str() {
"web" => { "web" => {
crate::builder::build(&crate_config)?; crate::builder::build(&crate_config)?;
} }
"desktop" => { "desktop" => {
crate::builder::build_desktop(&crate_config)?; crate::builder::build_desktop(&crate_config, false)?;
} }
_ => { _ => {
return custom_error!("Unsoppurt platform target."); return custom_error!("Unsoppurt platform target.");
+6 -6
View File
@@ -16,9 +16,9 @@ pub struct ConfigOptsBuild {
#[clap(long)] #[clap(long)]
pub example: Option<String>, pub example: Option<String>,
/// Build platform: support Web & Desktop [default: "web"] /// Build platform: support Web & Desktop [default: "default_platform"]
#[clap(long, default_value = "web")] #[clap(long)]
pub platform: String, pub platform: Option<String>,
} }
#[derive(Clone, Debug, Default, Deserialize, Parser)] #[derive(Clone, Debug, Default, Deserialize, Parser)]
@@ -36,9 +36,9 @@ pub struct ConfigOptsServe {
#[serde(default)] #[serde(default)]
pub release: bool, pub release: bool,
/// Build platform: support Web & Desktop [default: "web"] /// Build platform: support Web & Desktop [default: "default_platform"]
#[clap(long, default_value = "web")] #[clap(long)]
pub platform: String, pub platform: Option<String>,
} }
/// Ensure the given value for `--public-url` is formatted correctly. /// Ensure the given value for `--public-url` is formatted correctly.
+15 -2
View File
@@ -1,3 +1,8 @@
use std::{
io::Write,
path::PathBuf,
process::{Command, Stdio},
};
use super::*; use super::*;
/// Run the WASM project on dev-server /// Run the WASM project on dev-server
@@ -19,12 +24,20 @@ impl Serve {
crate_config.as_example(self.serve.example.unwrap()); crate_config.as_example(self.serve.example.unwrap());
} }
match self.serve.platform.as_str() { let platform = self.serve.platform.unwrap_or_else(|| {
crate_config
.dioxus_config
.application
.default_platform
.clone()
});
match platform.as_str() {
"web" => { "web" => {
crate::builder::build(&crate_config)?; crate::builder::build(&crate_config)?;
} }
"desktop" => { "desktop" => {
crate::builder::build_desktop(&crate_config)?; crate::builder::build_desktop(&crate_config, true)?;
match &crate_config.executable { match &crate_config.executable {
crate::ExecutableType::Binary(name) crate::ExecutableType::Binary(name)
+7 -7
View File
@@ -31,13 +31,13 @@ impl Default for DioxusConfig {
Self { Self {
application: ApplicationConfig { application: ApplicationConfig {
name: "dioxus".into(), name: "dioxus".into(),
platforms: vec![String::from("web")], default_platform: "web".to_string(),
out_dir: Some(PathBuf::from("dist")), out_dir: Some(PathBuf::from("dist")),
asset_dir: Some(PathBuf::from("public")),
}, },
web: WebConfig { web: WebConfig {
app: WebAppConfing { app: WebAppConfing {
title: Some("dioxus | ⛺".into()), title: Some("dioxus | ⛺".into()),
public_dir: Some(PathBuf::from("public")),
}, },
watcher: WebWatcherConfing { watcher: WebWatcherConfing {
watch_path: Some(vec![PathBuf::from("src")]), watch_path: Some(vec![PathBuf::from("src")]),
@@ -59,8 +59,9 @@ impl Default for DioxusConfig {
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApplicationConfig { pub struct ApplicationConfig {
pub name: String, pub name: String,
pub platforms: Vec<String>, pub default_platform: String,
pub out_dir: Option<PathBuf>, pub out_dir: Option<PathBuf>,
pub asset_dir: Option<PathBuf>,
} }
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
@@ -73,7 +74,6 @@ pub struct WebConfig {
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebAppConfing { pub struct WebAppConfing {
pub title: Option<String>, pub title: Option<String>,
pub public_dir: Option<PathBuf>,
} }
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
@@ -101,7 +101,7 @@ pub struct CrateConfig {
pub crate_dir: PathBuf, pub crate_dir: PathBuf,
pub workspace_dir: PathBuf, pub workspace_dir: PathBuf,
pub target_dir: PathBuf, pub target_dir: PathBuf,
pub public_dir: PathBuf, pub asset_dir: PathBuf,
pub manifest: cargo_toml::Manifest<cargo_toml::Value>, pub manifest: cargo_toml::Manifest<cargo_toml::Value>,
pub executable: ExecutableType, pub executable: ExecutableType,
pub dioxus_config: DioxusConfig, pub dioxus_config: DioxusConfig,
@@ -130,7 +130,7 @@ impl CrateConfig {
let cargo_def = &crate_dir.join("Cargo.toml"); let cargo_def = &crate_dir.join("Cargo.toml");
let public_dir = match dioxus_config.web.app.public_dir { let asset_dir = match dioxus_config.application.asset_dir {
Some(ref v) => crate_dir.join(v), Some(ref v) => crate_dir.join(v),
None => crate_dir.join("public"), None => crate_dir.join("public"),
}; };
@@ -154,7 +154,7 @@ impl CrateConfig {
crate_dir, crate_dir,
workspace_dir, workspace_dir,
target_dir, target_dir,
public_dir, asset_dir,
manifest, manifest,
executable, executable,
release, release,