1 parent
a8230d8ff0
commit
a519fba7dc
2 files changed
+70
-75
No files matched your search
@@ -372,7 +372,6 @@ pub(crate) struct BuildRequest {
|
|||||||
pub(crate) profile: String,
|
pub(crate) profile: String,
|
||||||
pub(crate) release: bool,
|
pub(crate) release: bool,
|
||||||
pub(crate) bundle: BundleFormat,
|
pub(crate) bundle: BundleFormat,
|
||||||
pub(crate) enabled_renderers: Vec<Renderer>,
|
|
||||||
pub(crate) triple: Triple,
|
pub(crate) triple: Triple,
|
||||||
pub(crate) device: bool,
|
pub(crate) device: bool,
|
||||||
pub(crate) package: String,
|
pub(crate) package: String,
|
||||||
@@ -619,12 +618,6 @@ impl BuildRequest {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// Just grab the renderers from the enabled renderers and discard the feature names
|
|
||||||
let enabled_renderers = enabled_renderers
|
|
||||||
.into_iter()
|
|
||||||
.map(|(renderer, _)| renderer)
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
// We usually use the simulator unless --device is passed *or* a device is detected by probing.
|
// We usually use the simulator unless --device is passed *or* a device is detected by probing.
|
||||||
// For now, though, since we don't have probing, it just defaults to false
|
// For now, though, since we don't have probing, it just defaults to false
|
||||||
// Tools like xcrun/adb can detect devices
|
// Tools like xcrun/adb can detect devices
|
||||||
@@ -808,7 +801,6 @@ impl BuildRequest {
|
|||||||
device,
|
device,
|
||||||
workspace,
|
workspace,
|
||||||
config,
|
config,
|
||||||
enabled_renderers,
|
|
||||||
target_dir,
|
target_dir,
|
||||||
custom_linker,
|
custom_linker,
|
||||||
link_args_file,
|
link_args_file,
|
||||||
|
|||||||
@@ -40,41 +40,77 @@ pub struct BuildTargets {
|
|||||||
pub server: Option<BuildRequest>,
|
pub server: Option<BuildRequest>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BuildArgs {
|
|
||||||
fn default_client(&self) -> &TargetArgs {
|
|
||||||
&self.build_arguments
|
|
||||||
}
|
|
||||||
|
|
||||||
fn default_server(&self, client: &BuildRequest) -> Option<&TargetArgs> {
|
|
||||||
// Now resolve the builds that we need to.
|
|
||||||
// These come from the args, but we'd like them to come from the `TargetCmd` chained object
|
|
||||||
//
|
|
||||||
// The process here is as follows:
|
|
||||||
//
|
|
||||||
// - Create the BuildRequest for the primary target
|
|
||||||
// - If that BuildRequest is "fullstack", then add the client features
|
|
||||||
// - If that BuildRequest is "fullstack", then also create a BuildRequest for the server
|
|
||||||
// with the server features
|
|
||||||
//
|
|
||||||
// This involves modifying the BuildRequest to add the client features and server features
|
|
||||||
// only if we can properly detect that it's a fullstack build. Careful with this, since
|
|
||||||
// we didn't build BuildRequest to be generally mutable.
|
|
||||||
let default_server = client.enabled_renderers.contains(&crate::Renderer::Server);
|
|
||||||
|
|
||||||
// Make sure we set the fullstack platform so we actually build the fullstack variant
|
|
||||||
// Users need to enable "fullstack" in their default feature set.
|
|
||||||
// todo(jon): fullstack *could* be a feature of the app, but right now we're assuming it's always enabled
|
|
||||||
//
|
|
||||||
// Now we need to resolve the client features
|
|
||||||
let fullstack = ((default_server || client.fullstack_feature_enabled())
|
|
||||||
|| self.fullstack.unwrap_or(false))
|
|
||||||
&& self.fullstack != Some(false);
|
|
||||||
|
|
||||||
fullstack.then_some(&self.build_arguments)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl CommandWithPlatformOverrides<BuildArgs> {
|
impl CommandWithPlatformOverrides<BuildArgs> {
|
||||||
|
/// We need to decompose the combined `BuildArgs` into the individual targets that we need to build.
|
||||||
|
///
|
||||||
|
/// Only in a few cases do we spin out an additional server binary:
|
||||||
|
/// - the fullstack feature is passed
|
||||||
|
/// - the fullstack flag is enabled
|
||||||
|
/// - the server flag is enabled
|
||||||
|
///
|
||||||
|
/// The buildtargets configuration comes in two flavors:
|
||||||
|
/// - implied via the `fullstack` feature
|
||||||
|
/// - explicit when using `@server and @client`
|
||||||
|
///
|
||||||
|
/// We use the client arguments to build the client target, and then make a few changes to make
|
||||||
|
/// the server target.
|
||||||
|
///
|
||||||
|
/// The `--fullstack` feature is basically the same as passing `--features fullstack`
|
||||||
|
///
|
||||||
|
/// Some examples:
|
||||||
|
/// ```shell, ignore
|
||||||
|
/// dx serve --target wasm32-unknown-unknown --fullstack # serves both client and server
|
||||||
|
/// dx serve --target wasm32-unknown-unknown --features fullstack # serves both client and server
|
||||||
|
/// dx serve --target wasm32-unknown-unknown # only serves the client
|
||||||
|
/// dx serve --target wasm32-unknown-unknown # servers both if `fullstack` is enabled on dioxus
|
||||||
|
/// dx serve @client --target wasm32-unknown-unknown # only serves the client
|
||||||
|
/// dx serve @client --target wasm32-unknown-unknown --fullstack # serves both client and server
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Currently it is not possible to serve the server without the client, but this could be added in the future.
|
||||||
|
pub async fn into_targets(self) -> Result<BuildTargets> {
|
||||||
|
let workspace = Workspace::current().await?;
|
||||||
|
|
||||||
|
// do some logging to ensure dx matches the dioxus version since we're not always API compatible
|
||||||
|
workspace.check_dioxus_version_against_cli();
|
||||||
|
|
||||||
|
// The client args are the `@client` arguments, or the shared build arguments if @client is not specified.
|
||||||
|
let client_args = &self.client.as_ref().unwrap_or(&self.shared).build_arguments;
|
||||||
|
|
||||||
|
// Create the client build request
|
||||||
|
let client = BuildRequest::new(client_args, None, workspace.clone()).await?;
|
||||||
|
|
||||||
|
// Create the server build request if needed
|
||||||
|
// This happens when 1) fullstack is enabled, 2)
|
||||||
|
let mut server = None;
|
||||||
|
if matches!(self.shared.fullstack, Some(true))
|
||||||
|
|| client.fullstack_feature_enabled()
|
||||||
|
|| self.server.is_some()
|
||||||
|
{
|
||||||
|
match self.server.as_ref() {
|
||||||
|
Some(server_args) => {
|
||||||
|
server = Some(
|
||||||
|
BuildRequest::new(
|
||||||
|
&server_args.build_arguments,
|
||||||
|
Some(client.main_target.clone()),
|
||||||
|
workspace.clone(),
|
||||||
|
)
|
||||||
|
.await?,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
let mut args = self.shared.build_arguments.clone();
|
||||||
|
args.platform = Some(crate::Platform::Server);
|
||||||
|
args.renderer.renderer = Some(crate::Renderer::Server);
|
||||||
|
args.target = Some(target_lexicon::Triple::host());
|
||||||
|
server = Some(BuildRequest::new(&args, None, workspace.clone()).await?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(BuildTargets { client, server })
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn build(self) -> Result<StructuredOutput> {
|
pub async fn build(self) -> Result<StructuredOutput> {
|
||||||
tracing::info!("Building project...");
|
tracing::info!("Building project...");
|
||||||
|
|
||||||
@@ -105,37 +141,4 @@ impl CommandWithPlatformOverrides<BuildArgs> {
|
|||||||
server: targets.server.map(|s| s.root_dir()),
|
server: targets.server.map(|s| s.root_dir()),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn into_targets(self) -> Result<BuildTargets> {
|
|
||||||
let workspace = Workspace::current().await?;
|
|
||||||
|
|
||||||
// do some logging to ensure dx matches the dioxus version since we're not always API compatible
|
|
||||||
workspace.check_dioxus_version_against_cli();
|
|
||||||
|
|
||||||
let client_args = match &self.client {
|
|
||||||
Some(client) => &client.build_arguments,
|
|
||||||
None => self.shared.default_client(),
|
|
||||||
};
|
|
||||||
let client = BuildRequest::new(client_args, None, workspace.clone()).await?;
|
|
||||||
|
|
||||||
let server_args = match &self.server {
|
|
||||||
Some(server) => Some(&server.build_arguments),
|
|
||||||
None => self.shared.default_server(&client),
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut server = None;
|
|
||||||
// If there is a server, make sure we output in the same directory as the client build so we use the server
|
|
||||||
// to serve the web client
|
|
||||||
if let Some(server_args) = server_args {
|
|
||||||
// Copy the main target from the client to the server
|
|
||||||
let main_target = client.main_target.clone();
|
|
||||||
let mut server_args = server_args.clone();
|
|
||||||
// The renderer in the server build is always set to Server
|
|
||||||
server_args.renderer.renderer = Some(crate::Renderer::Server);
|
|
||||||
server =
|
|
||||||
Some(BuildRequest::new(&server_args, Some(main_target), workspace.clone()).await?);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(BuildTargets { client, server })
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user