rust-analyzer icon indicating copy to clipboard operation
rust-analyzer copied to clipboard

Opening a project of a workspace checks the whole workspace

Open Ten0 opened this issue 4 years ago • 10 comments

I have a workspace which contains a large number of crates.

Say I need to do the following, in that order:

  • Update lib L
  • Fix crate A to new interface of lib L
  • Fix crate B to new interface of lib L

(A and B do not depend on each other)

When I try to completely update crate A, I can't see warnings and in general I get errors from project B, which I haven't fixed yet. This is due to rust-analyzer watching the whole workspace, even though I have only opened the root of A, and the Cargo.toml at the root of my folder is that of A.

I would expect that the current behaviour only happens when I open my workspace folder, and that when I open a single project it doesn't try to build the whole workspace, allowing me to completely fix a crate before moving to the next.

This would also have other benefits:

  • Performance: my workspace being very large, I rarely work on all projects at once so I would gain time and space by not building all of it
  • Feature flags testing: a global cargo check does not behave the same way as individual checks: when running a workspace check, all feature flags required in any crate of the workspace are enabled for every crate of the workspace, while when running a crate check, only the flags required for that specific crate are enabled.

Ten0 avatar Apr 14 '20 09:04 Ten0

#2792 may be another solution to the first part (though I'm not sure how it would behave with the warnings), but it doesn't do anything for the "other benefits".

Ten0 avatar Apr 14 '20 09:04 Ten0

The current workaround is to set checOnSave.overrideCommand to a cargo command which checks only a specific package.

matklad avatar Apr 15 '20 15:04 matklad

What's the original command and how should I set it so that it checks in the root of my project ? (I wouldn't want to remove any other important parameters)

Ten0 avatar Apr 15 '20 18:04 Ten0

Original one is cargo check --workspace --message-format=json

matklad avatar Apr 15 '20 21:04 matklad

I tried setting:

{
	"rust-analyzer.checkOnSave.overrideCommand": [
		"cargo",
		"check",
		"--message-format=json"
	]
}

and it seems to still check the whole workspace. :(

Ten0 avatar Apr 17 '20 14:04 Ten0

That’s the base command, yeah, you need to add -p some-package no top of it to narrow it to a single package

matklad avatar Apr 17 '20 14:04 matklad

Oh that's awful, I'd have to change everytime I open a project :(

Ten0 avatar Apr 17 '20 15:04 Ten0

I'm trying to make this work with extraArgs but I can't seem to do so (while it does work with https://github.com/rust-analyzer/rust-analyzer/issues/3975#issuecomment-615272400):

{
	"rust-analyzer.checkOnSave.extraArgs": [
		"-p",
		"some_crate",
	],
	"rust-analyzer.cargo.allFeatures": true
}

seems to still check the whole workspace.

Ten0 avatar Jan 12 '22 16:01 Ten0

That’s the base command, yeah, you need to add -p some-package no top of it to narrow it to a single package

So maybe a wrapper script to infer the current project and add the -p? I'm going to give that a try.

ellbur avatar Aug 02 '22 02:08 ellbur

So maybe a wrapper script to infer the current project and add the -p? I'm going to give that a try.

Alas, I can find no way to detect the package since the cwd is the workspace...

ellbur avatar Aug 02 '22 03:08 ellbur