mirror of
https://github.com/RGBCube/nu_scripts
synced 2025-08-01 06:37:46 +00:00
port conda to engine-q (#160)
This commit is contained in:
parent
68ad1695d0
commit
7b76a8e662
3 changed files with 101 additions and 0 deletions
45
engine-q/virtual_environments/README.md
Normal file
45
engine-q/virtual_environments/README.md
Normal file
|
@ -0,0 +1,45 @@
|
|||
# Virtual environment scripts
|
||||
|
||||
The scripts in this directory activate virtual environments for Conda environments. They follow the pattern described in the [Nushell 0.32
|
||||
changelog](https://www.nushell.sh/blog/2021-06-01-nushell_0_32.html#environment-loading-lily-mara):
|
||||
|
||||
```
|
||||
$ load-env (activate some-env)
|
||||
```
|
||||
|
||||
A custom command (`activate`) creates a table with environment variables and
|
||||
`load-env` is used to load it into the shell's scope.
|
||||
|
||||
In most cases, deactivation is a matter of restoring the PATH variable to the
|
||||
state before activating the env and removing any additional variables. There are
|
||||
no environment-specific elements to this, which is why the same deactivation
|
||||
script can be used for deactivating any environment of a specific type. For
|
||||
example, `source conda_deactivate.nu` will deactivate any Conda env, there are
|
||||
no input parameters.
|
||||
|
||||
## Expected Usage
|
||||
|
||||
1. Source an activation script in your `config.nu`. For example, `conda.nu`.
|
||||
You'll then have the `conda-env` command available.
|
||||
2. Create an alias for sourcing the appropriate deactivation script:
|
||||
`alias conda-deactivate = source /path/to/conda_deactivate.nu`
|
||||
3. Activate with `load-env (conda-env env-name)`. You might want to define some
|
||||
shorter aliases for both commands, if typing that every time seems like a
|
||||
hassle.
|
||||
4. If you're using [Starship](https://starship.rs/), your prompt should reflect the activated env.
|
||||
5. When done, deactivate with your alias: `conda-deactivate`.
|
||||
|
||||
Look at the script files to find the exact command name for creating an environment table.
|
||||
|
||||
## `conda.nu`
|
||||
|
||||
Limitations:
|
||||
|
||||
- The "root_prefix" might not actually correspond to the correct path to the Conda envs. You can fix
|
||||
this for your setup by changing how the root prefix is found in the `conda-env` command.
|
||||
- Nested envs are not well supported. If you activate a Conda env while another one is
|
||||
activated, new elements will be appended to the PATH, but the other environment
|
||||
variables will be overwritten. There's no way to then restore the PATH to the state
|
||||
it was in before activating the *first* env (at least not with this script directly).
|
||||
- The prompt is not updated by the script. Consider using [Starship](https://starship.rs/)
|
||||
with the Python prompt element.
|
49
engine-q/virtual_environments/conda.nu
Normal file
49
engine-q/virtual_environments/conda.nu
Normal file
|
@ -0,0 +1,49 @@
|
|||
def conda-env [env-name] {
|
||||
let conda-info = (conda info --envs --json | from json)
|
||||
let suffix = (if $env-name == "base" {""} else {(["envs" $env-name] | path join)})
|
||||
let env-dir = ([$conda-info.root_prefix $suffix] | path join)
|
||||
let old-path = ($env.PATH | str collect (path-sep))
|
||||
let new-path = (if (windows?) { (conda-create-path-windows $env-dir) } else { (conda-create-path-unix $env-dir) })
|
||||
let new-env = {
|
||||
CONDA_DEFAULT_ENV: $env-name
|
||||
CONDA_PREFIX: $env-dir
|
||||
CONDA_PROMPT_MODIFIER: $"[($env-name)]"
|
||||
CONDA_SHLVL: "1"
|
||||
CONDA_OLD_PATH: $old-path
|
||||
}
|
||||
$new-env | merge { $new-path }
|
||||
}
|
||||
|
||||
def conda-create-path-windows [env-dir] {
|
||||
# 1. Conda on Windows needs a few additional Path elements
|
||||
# 2. The path env var on Windows is called Path (not PATH)
|
||||
let env-path = [
|
||||
$env-dir
|
||||
([$env-dir "Scripts"] | path join)
|
||||
([$env-dir "Library" "mingw-w64"] | path join)
|
||||
([$env-dir "Library" "bin"] | path join)
|
||||
([$env-dir "Library" "usr" "bin"] | path join)
|
||||
]
|
||||
let new-path = ([$env-path $env.PATH] | flatten | str collect (path-sep))
|
||||
{
|
||||
PATH: $new-path
|
||||
}
|
||||
}
|
||||
|
||||
def conda-create-path-unix [env-dir] {
|
||||
let env-path = [
|
||||
([$env-dir "bin"] | path join)
|
||||
]
|
||||
let new-path = ([$env-path $env.PATH] | flatten | str collect (path-sep))
|
||||
{
|
||||
PATH: $new-path
|
||||
}
|
||||
}
|
||||
|
||||
def windows? [] {
|
||||
(sys).host.name == "Windows"
|
||||
}
|
||||
|
||||
def path-sep [] {
|
||||
if (windows?) { ";" } else { ":" }
|
||||
}
|
7
engine-q/virtual_environments/conda_deactivate.nu
Normal file
7
engine-q/virtual_environments/conda_deactivate.nu
Normal file
|
@ -0,0 +1,7 @@
|
|||
let path-name = (if ((sys).host.name == "Windows") { "Path" } else { "PATH" })
|
||||
let-env $path-name = $env.CONDA_OLD_PATH
|
||||
hide CONDA_PROMPT_MODIFIER
|
||||
hide CONDA_PREFIX
|
||||
hide CONDA_SHLVL
|
||||
hide CONDA_DEFAULT_ENV
|
||||
hide CONDA_OLD_PATH
|
Loading…
Add table
Add a link
Reference in a new issue