Dioxus: Difference between revisions
CathalMullan (talk | contribs) m Fix cargo log message |
CathalMullan (talk | contribs) m Fix page hierarchy. |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[https://dioxuslabs.com Dioxus] is a full-stack Rust app framework for web, desktop, mobile, and more. | [https://dioxuslabs.com Dioxus] is a full-stack [[Rust]] app framework for web, desktop, mobile, and more. | ||
=== Troubleshooting === | === Troubleshooting === | ||
Line 10: | Line 10: | ||
rust Wasm file schema version: 0.2.99 | rust Wasm file schema version: 0.2.99 | ||
this binary schema version: 0.2.97 | this binary schema version: 0.2.97 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===== Why does this happen? ===== | |||
Unlike most Rust crates, ''wasm-bindgen'' doesn't follow [https://semver.org semantic versioning (SemVer)]. This means even a patch version difference (like 0.2.97 vs 0.2.98) can contain breaking changes or incompatibilities. | |||
When you install ''dioxus-cli'' from Nixpkgs, it uses the exact versions of dependencies specified in the packages lock file, just like running <code>cargo install dioxus-cli --locked</code>. The versions present in the packages lock file are chosen '''at publishing time'''. | |||
# Pin ''wasm-bindgen'' to the version | When you add ''dioxus'' as a dependency in your project's ''Cargo.toml'' (or any other crate that requires on ''wasm-bindgen''), [https://doc.rust-lang.org/cargo/reference/resolver.html#semver-compatibility Cargo assumes that all dependencies follow SemVer], and pulls in the latest SemVer compatible version of ''wasm-bindgen.'' This will likely be a different version than was present in the ''dioxus-cli'' lock file, since ''wasm-bindgen'' tends to release quite often. | ||
There are two solutions to solving this: | |||
# Pin ''wasm-bindgen'' to the version that ''dioxus-cli'' expects. | |||
# Update ''dioxus-cli'' to use a newer lock file. | # Update ''dioxus-cli'' to use a newer lock file. | ||
===== | ===== Pin ''wasm-bindgen'' ===== | ||
Within your ''Cargo.toml'' file, force ''wasm-bindgen'' to use the expected version.<syntaxhighlight lang="toml"> | Within your ''Cargo.toml'' file, force ''wasm-bindgen'' to use the expected version by pinning it.<syntaxhighlight lang="toml"> | ||
[dependencies] | [dependencies] | ||
wasm-bindgen = "=0.2.97" | wasm-bindgen = "=0.2.97" | ||
Line 22: | Line 31: | ||
</syntaxhighlight>Run ''cargo update'', and you should see the version being downgraded.<syntaxhighlight lang="text"> | </syntaxhighlight>Run ''cargo update'', and you should see the version being downgraded.<syntaxhighlight lang="text"> | ||
Downgrading wasm-bindgen v0.2.99 -> v0.2.97 (available: v0.2.99) | Downgrading wasm-bindgen v0.2.99 -> v0.2.97 (available: v0.2.99) | ||
</syntaxhighlight>You will also want to ensure the version of ''wasm-bindgen-cli'' matches | </syntaxhighlight> | ||
===== Updating lock file ===== | |||
If you can't downgrade, you can instead manually update the lock file. | |||
Download the source from [https://crates.io/crates/dioxus-cli crates.io] for the given version of the CLI. | |||
e.g. https://crates.io/api/v1/crates/dioxus-cli/0.6.0/download | |||
Extract the file, <code>cd</code> into the directory, and run <code>cargo update</code>. You should be able to see the ''wasm-bindgen'' version being updated.<syntaxhighlight> | |||
Updating wasm-bindgen v0.2.97 -> v0.2.99 | |||
</syntaxhighlight>Copy the newly updated lock file into your project (here called ''Dioxus.lock''), and override the Nixpkgs version.<syntaxhighlight lang="nix"> | |||
dioxus-cli = pkgs.dioxus-cli.overrideAttrs (_: { | |||
postPatch = '' | |||
rm Cargo.lock | |||
cp ${./Dioxus.lock} Cargo.lock | |||
''; | |||
cargoDeps = pkgs.rustPlatform.importCargoLock { | |||
lockFile = ./Dioxus.lock; | |||
}; | |||
}); | |||
</syntaxhighlight> | |||
==== Choosing ''wasm-bindgen-cli'' version ==== | |||
You will also want to ensure the version of ''wasm-bindgen-cli'' matches whatever is in your lock file.<syntaxhighlight lang="nix"> | |||
cargoLock = builtins.fromTOML (builtins.readFile ./Cargo.lock); | cargoLock = builtins.fromTOML (builtins.readFile ./Cargo.lock); | ||
Line 36: | Line 70: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Category: | |||
[[Category:Rust]] |
Latest revision as of 14:25, 10 January 2025
Dioxus is a full-stack Rust app framework for web, desktop, mobile, and more.
Troubleshooting
wasm-bindgen mismatch
A common issue when using the dioxus-cli version from Nixpkgs is encountering the following error:
it looks like the Rust project used to create this Wasm file was linked against
version of wasm-bindgen that uses a different bindgen format than this binary:
rust Wasm file schema version: 0.2.99
this binary schema version: 0.2.97
Why does this happen?
Unlike most Rust crates, wasm-bindgen doesn't follow semantic versioning (SemVer). This means even a patch version difference (like 0.2.97 vs 0.2.98) can contain breaking changes or incompatibilities.
When you install dioxus-cli from Nixpkgs, it uses the exact versions of dependencies specified in the packages lock file, just like running cargo install dioxus-cli --locked
. The versions present in the packages lock file are chosen at publishing time.
When you add dioxus as a dependency in your project's Cargo.toml (or any other crate that requires on wasm-bindgen), Cargo assumes that all dependencies follow SemVer, and pulls in the latest SemVer compatible version of wasm-bindgen. This will likely be a different version than was present in the dioxus-cli lock file, since wasm-bindgen tends to release quite often.
There are two solutions to solving this:
- Pin wasm-bindgen to the version that dioxus-cli expects.
- Update dioxus-cli to use a newer lock file.
Pin wasm-bindgen
Within your Cargo.toml file, force wasm-bindgen to use the expected version by pinning it.
[dependencies]
wasm-bindgen = "=0.2.97"
Run cargo update, and you should see the version being downgraded.
Downgrading wasm-bindgen v0.2.99 -> v0.2.97 (available: v0.2.99)
Updating lock file
If you can't downgrade, you can instead manually update the lock file.
Download the source from crates.io for the given version of the CLI.
e.g. https://crates.io/api/v1/crates/dioxus-cli/0.6.0/download
Extract the file, cd
into the directory, and run cargo update
. You should be able to see the wasm-bindgen version being updated.
Updating wasm-bindgen v0.2.97 -> v0.2.99
Copy the newly updated lock file into your project (here called Dioxus.lock), and override the Nixpkgs version.
dioxus-cli = pkgs.dioxus-cli.overrideAttrs (_: {
postPatch = ''
rm Cargo.lock
cp ${./Dioxus.lock} Cargo.lock
'';
cargoDeps = pkgs.rustPlatform.importCargoLock {
lockFile = ./Dioxus.lock;
};
});
Choosing wasm-bindgen-cli version
You will also want to ensure the version of wasm-bindgen-cli matches whatever is in your lock file.
cargoLock = builtins.fromTOML (builtins.readFile ./Cargo.lock);
wasmBindgen = pkgs.lib.findFirst
(pkg: pkg.name == "wasm-bindgen")
(throw "Could not find wasm-bindgen package")
cargoLock.package;
wasm-bindgen-cli = pkgs.wasm-bindgen-cli.override {
version = wasmBindgen.version;
hash = pkgs.lib.fakeHash;
cargoHash = pkgs.lib.fakeHash;
};