- Add complete dark mode system with theme context and toggle - Implement dark mode toggle component in navigation menu - Add client-side routing with SSR-safe signal handling - Fix language selector styling for better dark mode compatibility - Add documentation system with mdBook integration - Improve navigation menu with proper external/internal link handling - Add comprehensive project documentation and configuration - Enhance theme system with localStorage persistence - Fix arena panic issues during server-side rendering - Add proper TypeScript configuration and build optimizations 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
166 lines
4.5 KiB
Markdown
166 lines
4.5 KiB
Markdown
# Leptos Serve Multiple Binary Targets Fix
|
|
|
|
## Problem
|
|
|
|
When running `cargo leptos serve`, the following error occurred:
|
|
|
|
```
|
|
Error:
|
|
0: at `/Users/jesusperezlorenzo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cargo-leptos-0.2.35/src/lib.rs:43:76`
|
|
1: at `/Users/jesusperezlorenzo/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cargo-leptos-0.2.35/src/config/mod.rs:58:84`
|
|
2: Several bin targets found for member "server", please specify which one to use with: [[workspace.metadata.leptos]] bin-target = "name"
|
|
```
|
|
|
|
## Root Cause
|
|
|
|
The `server` crate had multiple binary targets:
|
|
1. `server` (from `src/main.rs`) - the main application server
|
|
2. `config_tool` (from `src/bin/config_tool.rs`) - configuration management utility
|
|
|
|
Cargo-leptos couldn't determine which binary target to use for the leptos serve command.
|
|
|
|
## Solution
|
|
|
|
### 1. Added bin-target specification to workspace configuration
|
|
|
|
In `template/Cargo.toml`, added the `bin-target` specification:
|
|
|
|
```toml
|
|
[[workspace.metadata.leptos]]
|
|
# The name used by wasm-bindgen/cargo-leptos for the JS/WASM bundle. Defaults to the crate name
|
|
output-name = "website"
|
|
# Specify which binary target to use (fixes multiple bin targets error)
|
|
bin-target = "server"
|
|
# ... rest of configuration
|
|
```
|
|
|
|
### 2. Added explicit binary target definitions
|
|
|
|
In `template/server/Cargo.toml`, added explicit binary targets:
|
|
|
|
```toml
|
|
# Binary targets
|
|
[[bin]]
|
|
name = "server"
|
|
path = "src/main.rs"
|
|
|
|
[[bin]]
|
|
name = "config_tool"
|
|
path = "src/bin/config_tool.rs"
|
|
```
|
|
|
|
### 3. Fixed tokio LocalSet runtime issue
|
|
|
|
Added proper LocalSet configuration to handle leptos local tasks:
|
|
|
|
**In `template/server/src/main.rs`:**
|
|
```rust
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
// Create a LocalSet to handle leptos local tasks
|
|
let local = tokio::task::LocalSet::new();
|
|
local.run_until(run_server()).await
|
|
}
|
|
|
|
async fn run_server() -> Result<(), Box<dyn std::error::Error>> {
|
|
// All server logic moved here
|
|
// ...
|
|
}
|
|
```
|
|
|
|
### 4. Fixed WASM compatibility issue
|
|
|
|
Added the `js` feature to uuid dependencies for WASM target compatibility:
|
|
|
|
**In `template/server/Cargo.toml`:**
|
|
```toml
|
|
uuid = { version = "1.17", features = ["v4", "serde", "js"], optional = true }
|
|
```
|
|
|
|
**In `template/shared/Cargo.toml`:**
|
|
```toml
|
|
uuid = { version = "1.17", features = ["v4", "serde", "js"] }
|
|
```
|
|
|
|
## Verification
|
|
|
|
After applying the fixes:
|
|
|
|
1. ✅ `cargo leptos serve` no longer shows the "Several bin targets found" error
|
|
2. ✅ No more "spawn_local called from outside of a task::LocalSet" runtime panics
|
|
3. ✅ `cargo leptos build` completes successfully
|
|
4. ✅ WASM compilation works without uuid randomness errors
|
|
5. ✅ All project tests continue to pass
|
|
|
|
## Usage
|
|
|
|
Now you can use cargo-leptos commands without issues:
|
|
|
|
```bash
|
|
# Start development server
|
|
cargo leptos serve
|
|
|
|
# Start with custom configuration
|
|
cargo leptos serve -- -c config.dev.toml
|
|
|
|
# Build the project
|
|
cargo leptos build
|
|
|
|
# Build for production
|
|
cargo leptos build --release
|
|
|
|
# Watch for changes
|
|
cargo leptos watch
|
|
```
|
|
|
|
## Files Modified
|
|
|
|
1. **`template/Cargo.toml`** - Added `bin-target = "server"` to leptos metadata
|
|
2. **`template/server/src/main.rs`** - Added LocalSet configuration for leptos runtime
|
|
3. **`template/server/Cargo.toml`** - Added explicit binary targets and fixed uuid features
|
|
4. **`template/shared/Cargo.toml`** - Fixed uuid features for WASM compatibility
|
|
5. **`template/README.md`** - Added leptos serve documentation
|
|
6. **`template/docs/LEPTOS_SERVE.md`** - Created comprehensive leptos documentation
|
|
|
|
## Key Configuration
|
|
|
|
The critical fix is in the workspace `Cargo.toml`:
|
|
|
|
```toml
|
|
[[workspace.metadata.leptos]]
|
|
bin-target = "server" # This line fixes the multiple targets error
|
|
bin-package = "server"
|
|
lib-package = "client"
|
|
```
|
|
|
|
This tells cargo-leptos to use the `server` binary target (from `src/main.rs`) instead of the `config_tool` binary when running leptos commands.
|
|
|
|
## Additional Benefits
|
|
|
|
The fixes provide:
|
|
- Clearer project structure documentation
|
|
- Better IDE support for binary targets
|
|
- More predictable build behavior
|
|
- Proper leptos runtime context for local task spawning
|
|
- Enhanced error handling and graceful shutdown
|
|
|
|
## Testing
|
|
|
|
To verify the fix works:
|
|
|
|
```bash
|
|
# Should work without errors
|
|
cargo leptos serve --help
|
|
|
|
# Should build successfully
|
|
cargo leptos build
|
|
|
|
# Should start development server
|
|
cargo leptos serve -- -c config.dev.toml
|
|
```
|
|
|
|
## Related Documentation
|
|
|
|
- [Leptos Serve Documentation](./docs/LEPTOS_SERVE.md)
|
|
- [Cargo Leptos Documentation](https://github.com/leptos-rs/cargo-leptos)
|
|
- [Leptos Framework Documentation](https://leptos.dev/) |