build.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. use crate::assets::WebAssetConfigDropGuard;
  2. #[cfg(feature = "plugin")]
  3. use crate::plugin::PluginManager;
  4. use crate::server::fullstack::FullstackServerEnvGuard;
  5. use crate::server::fullstack::FullstackWebEnvGuard;
  6. use dioxus_cli_config::Platform;
  7. use super::*;
  8. /// Build the Rust WASM app and all of its assets.
  9. #[derive(Clone, Debug, Parser)]
  10. #[clap(name = "build")]
  11. pub struct Build {
  12. #[clap(flatten)]
  13. pub build: ConfigOptsBuild,
  14. }
  15. impl Build {
  16. pub fn build(self, bin: Option<PathBuf>, target_dir: Option<&std::path::Path>) -> Result<()> {
  17. let mut crate_config = dioxus_cli_config::CrateConfig::new(bin)?;
  18. if let Some(target_dir) = target_dir {
  19. crate_config.target_dir = target_dir.to_path_buf();
  20. }
  21. // change the release state.
  22. crate_config.with_release(self.build.release);
  23. crate_config.with_verbose(self.build.verbose);
  24. if self.build.example.is_some() {
  25. crate_config.as_example(self.build.example.clone().unwrap());
  26. }
  27. if self.build.profile.is_some() {
  28. crate_config.set_profile(self.build.profile.clone().unwrap());
  29. }
  30. if self.build.features.is_some() {
  31. crate_config.set_features(self.build.features.clone().unwrap());
  32. }
  33. let platform = self
  34. .build
  35. .platform
  36. .unwrap_or(crate_config.dioxus_config.application.default_platform);
  37. if let Some(target) = self.build.target.clone() {
  38. crate_config.set_target(target);
  39. }
  40. crate_config.set_cargo_args(self.build.cargo_args.clone());
  41. // #[cfg(feature = "plugin")]
  42. // let _ = PluginManager::on_build_start(&crate_config, &platform);
  43. let build_result = match platform {
  44. Platform::Web => crate::builder::build(&crate_config, false, self.build.skip_assets)?,
  45. Platform::Desktop => {
  46. crate::builder::build_desktop(&crate_config, false, self.build.skip_assets)?
  47. }
  48. Platform::Fullstack => {
  49. // Fullstack mode must be built with web configs on the desktop (server) binary as well as the web binary
  50. let _config = WebAssetConfigDropGuard::new();
  51. {
  52. let mut web_config = crate_config.clone();
  53. let _gaurd = FullstackWebEnvGuard::new(&self.build);
  54. let web_feature = self.build.client_feature;
  55. let features = &mut web_config.features;
  56. match features {
  57. Some(features) => {
  58. features.push(web_feature);
  59. }
  60. None => web_config.features = Some(vec![web_feature]),
  61. };
  62. crate::builder::build(&crate_config, false, self.build.skip_assets)?;
  63. }
  64. {
  65. let mut desktop_config = crate_config.clone();
  66. let desktop_feature = self.build.server_feature;
  67. let features = &mut desktop_config.features;
  68. match features {
  69. Some(features) => {
  70. features.push(desktop_feature);
  71. }
  72. None => desktop_config.features = Some(vec![desktop_feature]),
  73. };
  74. let _gaurd =
  75. FullstackServerEnvGuard::new(self.build.force_debug, self.build.release);
  76. crate::builder::build_desktop(&desktop_config, false, self.build.skip_assets)?
  77. }
  78. }
  79. };
  80. let temp = gen_page(&crate_config, build_result.assets.as_ref(), false);
  81. let mut file = std::fs::File::create(
  82. crate_config
  83. .crate_dir
  84. .join(crate_config.dioxus_config.application.out_dir.clone())
  85. .join("index.html"),
  86. )?;
  87. file.write_all(temp.as_bytes())?;
  88. // #[cfg(feature = "plugin")]
  89. // let _ = PluginManager::on_build_finish(&crate_config, &platform);
  90. Ok(())
  91. }
  92. }