Skip to content

Commit 335ac2e

Browse files
committed
feat: use nu-env/ for all nu environment things, including modules/ subdir
1 parent fdde092 commit 335ac2e

3 files changed

Lines changed: 29 additions & 24 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ A quiver project is a directory containing:
6969
- **`<project-dir-name>/mod.nu`** - the Nushell module entry point
7070
- **`quiver.lock`** - auto-generated lockfile pinning exact commits (commit this to version control)
7171

72-
Running `qv install` fetches module dependencies into `.nu_modules/`.
72+
Running `qv install` fetches module dependencies into `.nu-env/modules/`.
7373

7474
## Activation
7575

@@ -78,12 +78,12 @@ To make installed modules available to `use` in Nushell without full paths, add
7878
### 1. Manual Activation (Recommended)
7979
`qv install` and `qv init` generate:
8080

81-
- `.nu_modules/activate.nu` (module overlay): updates `$env.NU_LIB_DIRS` and imports module dependencies with `export use <name> *`
81+
- `.nu-env/activate.nu` (module overlay): updates `$env.NU_LIB_DIRS` and imports module dependencies with `export use <name> *`
8282

8383
Activate modules with an overlay:
8484

8585
```nu
86-
overlay use .nu_modules/activate.nu
86+
overlay use .nu-env/activate.nu
8787
```
8888

8989
When you're done, run `deactivate` (or `overlay hide activate`) to unload the module overlay.

src/installer.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ use crate::manifest::Manifest;
99
use crate::resolver::{self, ResolvedDep};
1010
use walkdir::WalkDir;
1111

12-
/// The name of the directory where local dependencies are installed.
13-
const MODULES_DIR: &str = ".nu_modules";
12+
/// The name of the local environment directory.
13+
const NU_ENV_DIR: &str = ".nu-env";
14+
/// The subdirectory within `.nu-env/` where module files are installed.
15+
const MODULES_SUBDIR: &str = "modules";
1416

1517
#[derive(Debug, Default)]
1618
struct NupmMetadataHints {
@@ -22,11 +24,13 @@ struct NupmMetadataHints {
2224
pub fn install(project_dir: &Path, frozen: bool) -> Result<()> {
2325
let manifest = Manifest::from_dir(project_dir)?;
2426
let lock_path = project_dir.join("quiver.lock");
25-
let modules_dir = project_dir.join(MODULES_DIR);
27+
let nu_env_dir = project_dir.join(NU_ENV_DIR);
28+
let modules_dir = nu_env_dir.join(MODULES_SUBDIR);
29+
let display_name = format!("{NU_ENV_DIR}/{MODULES_SUBDIR}");
2630

2731
if manifest.dependencies.is_empty() {
2832
eprintln!("No dependencies declared in nupackage.toml.");
29-
write_activate_overlay(&modules_dir, MODULES_DIR, std::iter::empty::<&str>())?;
33+
write_activate_overlay(&nu_env_dir, &display_name, std::iter::empty::<&str>())?;
3034
return Ok(());
3135
}
3236

@@ -62,7 +66,7 @@ pub fn install(project_dir: &Path, frozen: bool) -> Result<()> {
6266
};
6367

6468
// Install each dependency
65-
install_resolved(&resolved_modules, &modules_dir, &lock_path, MODULES_DIR)
69+
install_resolved(&resolved_modules, &modules_dir, &lock_path, &nu_env_dir, &display_name)
6670
}
6771

6872
/// Run an update: always re-resolve, ignoring existing lockfile.
@@ -174,6 +178,7 @@ fn install_resolved(
174178
modules: &[ResolvedDep],
175179
modules_dir: &Path,
176180
lock_path: &Path,
181+
overlay_dir: &Path,
177182
display_name: &str,
178183
) -> Result<()> {
179184
std::fs::create_dir_all(modules_dir)?;
@@ -218,7 +223,7 @@ fn install_resolved(
218223
eprintln!("Installed {module_count} module{module_suffix} into {display_name}/");
219224

220225
write_activate_overlay(
221-
modules_dir,
226+
overlay_dir,
222227
display_name,
223228
module_use_paths.iter().map(|path| path.as_str()),
224229
)?;
@@ -227,19 +232,19 @@ fn install_resolved(
227232
}
228233

229234
fn write_activate_overlay<IM, SM>(
230-
modules_dir: &Path,
235+
overlay_dir: &Path,
231236
display_name: &str,
232237
module_names: IM,
233238
) -> Result<()>
234239
where
235240
IM: IntoIterator<Item = SM>,
236241
SM: AsRef<str>,
237242
{
238-
std::fs::create_dir_all(modules_dir)?;
243+
std::fs::create_dir_all(overlay_dir)?;
239244

240-
let activate_path = modules_dir.join("activate.nu");
245+
let activate_path = overlay_dir.join("activate.nu");
241246
let mut activate_script = String::from(
242-
"# Generated by quiver - do not edit\nexport-env {\n let modules_dir = ($env.FILE_PWD | path join)\n $env.NU_LIB_DIRS = ($env.NU_LIB_DIRS | default [] | append $modules_dir)\n}\n\n",
247+
"# Generated by quiver - do not edit\nexport-env {\n let modules_dir = ($env.FILE_PWD | path join \"modules\")\n $env.NU_LIB_DIRS = ($env.NU_LIB_DIRS | default [] | append $modules_dir)\n}\n\n",
243248
);
244249

245250
for module_name in module_names {
@@ -605,7 +610,7 @@ mod tests {
605610
fn writes_activate_overlay_with_modules() {
606611
let modules_dir = make_temp_dir("with_modules");
607612

608-
write_activate_overlay(&modules_dir, ".nu_modules", ["nu-foo", "nu-bar"]).unwrap();
613+
write_activate_overlay(&modules_dir, ".nu-env/modules", ["nu-foo", "nu-bar"]).unwrap();
609614

610615
let activate = std::fs::read_to_string(modules_dir.join("activate.nu")).unwrap();
611616
assert!(activate.contains("export use nu-foo *"));
@@ -619,7 +624,7 @@ mod tests {
619624
fn writes_activate_overlay_without_modules() {
620625
let modules_dir = make_temp_dir("without_modules");
621626

622-
write_activate_overlay(&modules_dir, ".nu_modules", std::iter::empty::<&str>()).unwrap();
627+
write_activate_overlay(&modules_dir, ".nu-env/modules", std::iter::empty::<&str>()).unwrap();
623628

624629
let activate = std::fs::read_to_string(modules_dir.join("activate.nu")).unwrap();
625630
assert!(!activate.lines().any(|line| line.starts_with("export use ")));
@@ -745,7 +750,7 @@ version = "0.1.0"
745750
install(&project_dir, true).unwrap();
746751

747752
let activate =
748-
std::fs::read_to_string(project_dir.join(".nu_modules").join("activate.nu")).unwrap();
753+
std::fs::read_to_string(project_dir.join(".nu-env").join("activate.nu")).unwrap();
749754
assert!(!activate.lines().any(|line| line.starts_with("export use ")));
750755
assert!(activate.contains("export alias deactivate = overlay hide activate"));
751756

src/main.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ fn cmd_init(
118118
std::fs::write(
119119
&mod_nu,
120120
r#"# Module entry point
121-
# Export your commands here with: export use <submodule>
122-
# Use installed modules with: use ../.nu_modules/module-name/module-name *
121+
# Export your commands here with: export use <submodule>
122+
# Use installed modules with: use ../.nu-env/modules/module-name/module-name *
123123
"#,
124124
)?;
125125
eprintln!("Created {}", mod_nu.display());
@@ -244,11 +244,11 @@ fn cmd_remove(dir: &Path, name: String) -> Result<()> {
244244
std::fs::write(dir.join("nupackage.toml"), content)?;
245245
eprintln!("Removed module '{name}' from nupackage.toml");
246246

247-
// Remove from .nu_modules/
248-
let module_dir = dir.join(".nu_modules").join(&name);
247+
// Remove from .nu-env/modules/
248+
let module_dir = dir.join(".nu-env").join("modules").join(&name);
249249
if module_dir.exists() {
250250
std::fs::remove_dir_all(&module_dir)?;
251-
eprintln!("Removed .nu_modules/{name}/");
251+
eprintln!("Removed .nu-env/modules/{name}/");
252252
}
253253

254254
// Update lockfile: remove the package entry
@@ -324,12 +324,12 @@ $env.config.hooks.env_change.PWD = (
324324
325325
# Remove previous directory's modules if it was a quiver project
326326
if ($before | is-not-empty) and ($before | path join "nupackage.toml" | path exists) {
327-
let old_modules = ($before | path join ".nu_modules")
327+
let old_modules = ($before | path join ".nu-env" "modules")
328328
$env.NU_LIB_DIRS = ($env.NU_LIB_DIRS | default [] | where {|it| $it != $old_modules })
329329
}
330330
# Add new directory's modules if it is a quiver project
331331
if ($after | is-not-empty) and ($after | path join "nupackage.toml" | path exists) {
332-
let new_modules = ($after | path join ".nu_modules")
332+
let new_modules = ($after | path join ".nu-env" "modules")
333333
if ($new_modules | path exists) and ($new_modules not-in ($env.NU_LIB_DIRS | default [])) {
334334
$env.NU_LIB_DIRS = ($env.NU_LIB_DIRS | default [] | append $new_modules)
335335
}
@@ -347,7 +347,7 @@ fn cmd_version() -> Result<()> {
347347

348348
fn cmd_list(cwd: &Path) -> Result<()> {
349349
if cwd.join("nupackage.toml").exists() {
350-
let modules_dir = cwd.join(".nu_modules");
350+
let modules_dir = cwd.join(".nu-env").join("modules");
351351
let modules = list_installed_module_names(&modules_dir)?;
352352

353353
if modules.is_empty() {

0 commit comments

Comments
 (0)