Cargo subcommand to run cargo
on Windows from within a WSL shell.
cargo-win
is a small tool for a bit of a niche use-case: Developing Rust projects inside the
Windows Subsystem for Linux, but needing to compile and/or run the project on Windows itself. This
comes up for example if you prefer to work in a Linux environment but develop an application
involving a GUI or other features currently not supported in WSL.
To work around those limitations, using this tool you can develop and store such projects inside
WSL, but then run them with a Windows version of cargo
, rustc
, etc., all without ever leaving
the WSL shell.
$ cargo win <cargo subcommand> [args]
This will execute cargo subcommand [args]
on Windows, using the Windows cargo
.
Examples:
$ cargo win run --release
$ cargo win test
cargo-win
will also attempt to detect the current rustup
toolchain in use and pass a
more-or-less-equivalent RUSTUP_TOOLCHAIN
environment variable to the Windows side. This cannot use
the exact same toolchain: If nightly-x86_64-unknown-linux-gnu
is in use on Linux, that cannot be
used on Windows. Instead, RUSTUP_TOOLCHAIN
will be set to just nightly
on Windows. This does not
guarantee that the exact same nightly version is used however.
Install using cargo install
, either by cloning yourself and using cargo install --path
or by using cargo install --git
. For the moment, no crates.io version of this exists.
cargo-win
currently creates a target directory in <temp folder>\cargo-win\<workspace-name>
for
any workspace from which it is executed, and then uses the Windows-WSL interopability features
to execute the Windows cargo
in the current working directory, but with a CARGO_TARGET_DIR
override set to that path.
By using the same path for a workspace every time, cargo
can re-use dependencies already
compiled and so forth. However the above path is also never cleaned up, so if you care about
not leaving old directories around there forever, you'll have to clean it up yourself.
The subfolder in a temp folder is used instead of e.g. simply a target-win
folder next to
the target
folder inside the workspace, because rustc
unfortunately currently crashes
if incremental compilation is on and the target folder is inside a WSL path.
(rust-lang/rust#49773)
If you encounter any issues using this tool, or need any additional configuration options or features to make effective use of it, please feel free to open an issue (or a PR)!
Licensed under either
- Apache License, Version 2.0 (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0.html), or
- MIT License (LICENSE-MIT or https://spdx.org/licenses/MIT.html) at your option.