build.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. use tauri_bundler::{
  2. build_project,
  3. bundle::{bundle_project, PackageType, SettingsBuilder},
  4. };
  5. use crate::helpers::{
  6. app_paths::{app_dir, tauri_dir},
  7. config::get as get_config,
  8. execute_with_output,
  9. manifest::rewrite_manifest,
  10. TauriHtml,
  11. };
  12. use std::env::{set_current_dir, set_var};
  13. use std::fs::read_to_string;
  14. use std::fs::File;
  15. use std::io::Write;
  16. use std::path::PathBuf;
  17. use std::process::Command;
  18. #[derive(Default)]
  19. pub struct Build {
  20. debug: bool,
  21. verbose: bool,
  22. targets: Option<Vec<String>>,
  23. config: Option<String>,
  24. }
  25. impl Build {
  26. pub fn new() -> Self {
  27. Default::default()
  28. }
  29. pub fn debug(mut self) -> Self {
  30. self.debug = true;
  31. self
  32. }
  33. pub fn verbose(mut self) -> Self {
  34. self.verbose = true;
  35. self
  36. }
  37. pub fn targets(mut self, targets: Vec<String>) -> Self {
  38. self.targets = Some(targets);
  39. self
  40. }
  41. pub fn config(mut self, config: String) -> Self {
  42. self.config.replace(config);
  43. self
  44. }
  45. pub fn run(self) -> crate::Result<()> {
  46. let config = get_config(self.config.as_deref())?;
  47. let config_guard = config.lock().unwrap();
  48. let config_ = config_guard.as_ref().unwrap();
  49. let feature = if config_.tauri.embedded_server.active {
  50. "embedded-server"
  51. } else {
  52. "no-server"
  53. };
  54. let mut settings_builder = SettingsBuilder::new().features(vec![feature.to_string()]);
  55. if !self.debug {
  56. settings_builder = settings_builder.release();
  57. }
  58. if self.verbose {
  59. settings_builder = settings_builder.verbose();
  60. }
  61. if let Some(names) = self.targets {
  62. let mut types = vec![];
  63. for name in names {
  64. match PackageType::from_short_name(&name) {
  65. Some(package_type) => {
  66. types.push(package_type);
  67. }
  68. None => {
  69. return Err(anyhow::anyhow!(format!(
  70. "Unsupported bundle format: {}",
  71. name
  72. )));
  73. }
  74. }
  75. }
  76. settings_builder = settings_builder.package_types(types);
  77. }
  78. let tauri_path = tauri_dir();
  79. set_current_dir(&tauri_path)?;
  80. set_var("TAURI_DIR", &tauri_path);
  81. set_var("TAURI_DIST_DIR", tauri_path.join(&config_.build.dist_dir));
  82. drop(config_guard);
  83. rewrite_manifest(config.clone())?;
  84. let config_guard = config.lock().unwrap();
  85. let config_ = config_guard.as_ref().unwrap();
  86. let index_html_path = PathBuf::from(&config_.build.dist_dir).join("index.html");
  87. let tauri_html = TauriHtml::new(&config_.build.dist_dir, read_to_string(index_html_path)?)
  88. .inliner_enabled(config_.tauri.inliner.active && !config_.tauri.embedded_server.active)
  89. .global_tauri(config_.build.with_global_tauri)
  90. .generate()?;
  91. let tauri_index_html_path = PathBuf::from(&config_.build.dist_dir).join("index.tauri.html");
  92. let mut tauri_index_html_file = File::create(tauri_index_html_path)?;
  93. tauri_index_html_file.write_all(tauri_html.as_bytes())?;
  94. let settings = settings_builder.build()?;
  95. if let Some(before_build) = &config_.build.before_build_command {
  96. let mut cmd: Option<&str> = None;
  97. let mut args: Vec<&str> = vec![];
  98. for token in before_build.split(' ') {
  99. if cmd.is_none() && !token.is_empty() {
  100. cmd = Some(token);
  101. } else {
  102. args.push(token)
  103. }
  104. }
  105. if let Some(cmd) = cmd {
  106. let mut command = Command::new(cmd);
  107. command.args(args).current_dir(app_dir());
  108. execute_with_output(&mut command)?;
  109. }
  110. }
  111. build_project(&settings)?;
  112. if config_.tauri.bundle.active {
  113. bundle_project(settings)?;
  114. }
  115. Ok(())
  116. }
  117. }