diff --git a/.changeset/bare-cache-dir-flag.md b/.changeset/bare-cache-dir-flag.md
new file mode 100644
index 0000000000..8daf0975b6
--- /dev/null
+++ b/.changeset/bare-cache-dir-flag.md
@@ -0,0 +1,5 @@
+---
+"pacquet": patch
+---
+
+pnpm now accepts the `--cache-dir
` flag, as in `pnpm install --cache-dir /tmp/pnpm-cache` [#17422](https://github.com/pnpm/pnpm/issues/17422).
diff --git a/pnpm/crates/cli/src/config_overrides/tests/bare_flags.rs b/pnpm/crates/cli/src/config_overrides/tests/bare_flags.rs
index b2d418c0c1..868a9d3361 100644
--- a/pnpm/crates/cli/src/config_overrides/tests/bare_flags.rs
+++ b/pnpm/crates/cli/src/config_overrides/tests/bare_flags.rs
@@ -18,6 +18,22 @@ fn extract_accepts_the_on_fail_settings_as_bare_flags() {
assert_eq!(config.runtime_on_fail, Some(RuntimeOnFail::Warn));
}
+#[test]
+fn extract_accepts_cache_dir_as_a_bare_flag() {
+ let (overrides, remaining) =
+ ConfigOverrides::extract(argv(["pacquet", "install", "--cache-dir", "/tmp/pnpm-cache"]));
+
+ assert_eq!(remaining, argv(["pacquet", "install"]));
+ assert_eq!(
+ overrides
+ .cli_layer(None)
+ .setting_values
+ .get("cache-dir")
+ .map(String::as_str),
+ Some("/tmp/pnpm-cache"),
+ );
+}
+
#[test]
fn extract_leaves_other_bare_flags_for_clap() {
let (_, remaining) =
diff --git a/pnpm/crates/cli/src/config_overrides/tokens.rs b/pnpm/crates/cli/src/config_overrides/tokens.rs
index 1ae4584573..154b23c704 100644
--- a/pnpm/crates/cli/src/config_overrides/tokens.rs
+++ b/pnpm/crates/cli/src/config_overrides/tokens.rs
@@ -154,9 +154,10 @@ pub(super) enum SettingArity {
/// setting the invoked command declares as its own option is left for
/// clap; a setting that collides with a *global* option would be claimed
/// on every command line and so must not appear here at all.
-pub(super) const BARE_SETTING_FLAGS: [(&str, SettingArity); 46] = [
+pub(super) const BARE_SETTING_FLAGS: [(&str, SettingArity); 47] = [
("allow-unused-patches", SettingArity::Boolean),
("auto-dedupe", SettingArity::Boolean),
+ ("cache-dir", SettingArity::Text),
("child-concurrency", SettingArity::Parsed(is_i32)),
("dangerously-allow-all-builds", SettingArity::Boolean),
("engine-strict", SettingArity::Boolean),
diff --git a/pnpm/crates/cli/tests/suite/setting_flags.rs b/pnpm/crates/cli/tests/suite/setting_flags.rs
index 403bd41095..9da65b451c 100644
--- a/pnpm/crates/cli/tests/suite/setting_flags.rs
+++ b/pnpm/crates/cli/tests/suite/setting_flags.rs
@@ -12,7 +12,8 @@ use std::{fs, process::Command};
/// Every setting flag, the value it is given, and what `pnpm config get`
/// reports back for it.
-const SETTING_FLAGS: [(&[&str], &str, &str); 17] = [
+const SETTING_FLAGS: [(&[&str], &str, &str); 18] = [
+ (&["--cache-dir", "/custom/cache"], "cache-dir", "/custom/cache"),
(&["--package-import-method", "hardlink"], "package-import-method", "hardlink"),
(&["--hoist-pattern=eslint"], "hoist-pattern", "[\n \"eslint\"\n]"),
(&["--public-hoist-pattern=@types/*"], "public-hoist-pattern", "[\n \"@types/*\"\n]"),
diff --git a/pnpm/crates/config/src/tests/cli_setting_values.rs b/pnpm/crates/config/src/tests/cli_setting_values.rs
index 99aed774c8..2f82b8f80a 100644
--- a/pnpm/crates/config/src/tests/cli_setting_values.rs
+++ b/pnpm/crates/config/src/tests/cli_setting_values.rs
@@ -39,6 +39,20 @@ fn cli_setting_values_win_over_the_workspace_yaml() {
assert_eq!(config.workspace_dir.as_deref(), Some(workspace.path()));
}
+#[test]
+fn cache_dir_cli_setting_overrides_the_default() {
+ let project = tempdir().expect("project tempdir");
+ let cache_dir = project.path().join("pnpm-cache");
+ let cache_dir_str = cache_dir.to_str().expect("utf-8 tempdir path");
+
+ let config = config_with_cli_settings(&[("cache-dir", cache_dir_str)])
+ .current::(project.path())
+ .expect("loads");
+
+ assert_eq!(config.cache_dir, cache_dir);
+ assert_eq!(config.explicit_settings.get("cacheDir"), Some(&cache_dir_str.into()));
+}
+
#[test]
fn empty_cli_node_options_override_the_workspace_yaml() {
let project = tempdir().expect("project tempdir");