mirror of
https://github.com/nushell/nu_scripts.git
synced 2024-10-26 22:08:03 +03:00
Port before v0.60/virtual_environments
(#849)
This PR is part of porting all old scripts #221 and includes the `virtual_environments` module ## 5 files changed - `conda.nu`: removed, already in `modules/virtual_enviromnents/conda/nu_conda.nu` - `conda_deactivate.nu`: also removed, has already been merged with `nu_conda.nu` - `README.nu`: removed, similar info in `modules/virtual_enviromnents/README.md` - `venv.nu`: ported to `modules/virtual_enviromnents/venv/venv.nu` - `venv_deactivate.nu`: ported to `modules/virtual_enviromnents/venv/venv_deactivate.nu`
This commit is contained in:
parent
275a0f8f26
commit
840d723d89
@ -1,53 +0,0 @@
|
|||||||
# Virtual environment scripts
|
|
||||||
|
|
||||||
The scripts in this directory activate virtual environments like Python venvs
|
|
||||||
and 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.toml`. 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.
|
|
||||||
|
|
||||||
## `venv.nu`
|
|
||||||
|
|
||||||
Limitations:
|
|
||||||
|
|
||||||
- The prompt is not updated by the script. Consider using [Starship](https://starship.rs/)
|
|
||||||
with the Python prompt element.
|
|
@ -1,45 +0,0 @@
|
|||||||
def conda-env [env-name] {
|
|
||||||
let conda-info = (conda info --envs --json | from json)
|
|
||||||
let suffix = (if $env-name == "base" {""} {(["envs" $env-name] | path join)})
|
|
||||||
let env-dir = ([$conda-info.root_prefix $suffix] | path join)
|
|
||||||
let old-path = ($nu.path | str collect (path-sep))
|
|
||||||
let new-path = (if (windows?) { (conda-create-path-windows $env-dir) } { (conda-create-path-unix $env-dir) })
|
|
||||||
let new-env = [[name, value];
|
|
||||||
[CONDA_DEFAULT_ENV $env-name]
|
|
||||||
[CONDA_PREFIX $env-dir]
|
|
||||||
[CONDA_PROMPT_MODIFIER $"[($env-name)]"]
|
|
||||||
[CONDA_SHLVL "1"]
|
|
||||||
[CONDA_OLD_PATH $old-path]]
|
|
||||||
|
|
||||||
$new-env | append $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 $nu.path] | flatten | str collect (path-sep))
|
|
||||||
[[name, value]; [Path $new-path]]
|
|
||||||
}
|
|
||||||
|
|
||||||
def conda-create-path-unix [env-dir] {
|
|
||||||
let env-path = [
|
|
||||||
([$env-dir "bin"] | path join)
|
|
||||||
]
|
|
||||||
let new-path = ([$env-path $nu.path] | flatten | str collect (path-sep))
|
|
||||||
[[name, value]; [PATH $new-path]]
|
|
||||||
}
|
|
||||||
|
|
||||||
def windows? [] {
|
|
||||||
(sys).host.name == "Windows"
|
|
||||||
}
|
|
||||||
|
|
||||||
def path-sep [] {
|
|
||||||
if (windows?) { ";" } { ":" }
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
let path-name = (if ((sys).host.name == "Windows") { "Path" } { "PATH" })
|
|
||||||
let-env $path-name = $nu.env.CONDA_OLD_PATH
|
|
||||||
unlet-env CONDA_PROMPT_MODIFIER
|
|
||||||
unlet-env CONDA_PREFIX
|
|
||||||
unlet-env CONDA_SHLVL
|
|
||||||
unlet-env CONDA_DEFAULT_ENV
|
|
||||||
unlet-env CONDA_OLD_PATH
|
|
@ -1,33 +0,0 @@
|
|||||||
def venv [venv-dir] {
|
|
||||||
let venv-abs-dir = ($venv-dir | path expand)
|
|
||||||
let venv-name = ($venv-abs-dir | path basename)
|
|
||||||
let old-path = ($nu.path | str collect (path-sep))
|
|
||||||
let new-path = (if (windows?) { (venv-path-windows $venv-abs-dir) } { (venv-path-unix $venv-abs-dir) })
|
|
||||||
let new-env = [[name, value];
|
|
||||||
[VENV_OLD_PATH $old-path]
|
|
||||||
[VIRTUAL_ENV $venv-name]]
|
|
||||||
|
|
||||||
$new-env | append $new-path
|
|
||||||
}
|
|
||||||
|
|
||||||
def venv-path-unix [venv-dir] {
|
|
||||||
let venv-path = ([$venv-dir "bin"] | path join)
|
|
||||||
let new-path = ($nu.path | prepend $venv-path | str collect (path-sep))
|
|
||||||
[[name, value]; [PATH $new-path]]
|
|
||||||
}
|
|
||||||
|
|
||||||
def venv-path-windows [venv-dir] {
|
|
||||||
# 1. Conda on Windows needs a few additional Path elements
|
|
||||||
# 2. The path env var on Windows is called Path (not PATH)
|
|
||||||
let venv-path = ([$venv-dir "Scripts"] | path join)
|
|
||||||
let new-path = ($nu.path | prepend $venv-path | str collect (path-sep))
|
|
||||||
[[name, value]; [Path $new-path]]
|
|
||||||
}
|
|
||||||
|
|
||||||
def windows? [] {
|
|
||||||
(sys).host.name == "Windows"
|
|
||||||
}
|
|
||||||
|
|
||||||
def path-sep [] {
|
|
||||||
if (windows?) { ";" } { ":" }
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
let path-name = (if ((sys).host.name == "Windows") { "Path" } { "PATH" })
|
|
||||||
let-env $path-name = $nu.env.VENV_OLD_PATH
|
|
||||||
unlet-env VIRTUAL_ENV
|
|
||||||
unlet-env VENV_OLD_PATH
|
|
25
modules/virtual_environments/venv.nu
Normal file
25
modules/virtual_environments/venv.nu
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
export def --env activate [venv_dir] {
|
||||||
|
let venv_abs_dir = ($venv_dir | path expand)
|
||||||
|
let venv_name = ($venv_abs_dir | path basename)
|
||||||
|
let old_path = $env.PATH
|
||||||
|
let new_path = (venv-path $venv_abs_dir)
|
||||||
|
let new_env = ({VENV_OLD_PATH: $old_path, VIRTUAL_ENV: $venv_name} | merge $new_path)
|
||||||
|
load-env $new_env
|
||||||
|
}
|
||||||
|
|
||||||
|
def "venv-path" [venv_dir] {
|
||||||
|
let env_path = [
|
||||||
|
$venv_dir,
|
||||||
|
([$venv_dir, "bin"] | path join)
|
||||||
|
]
|
||||||
|
return {
|
||||||
|
PATH: ($env.PATH | prepend $env_path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export def --env deactivate [] {
|
||||||
|
$env.PATH = $env.VENV_OLD_PATH
|
||||||
|
hide-env VIRTUAL_ENV
|
||||||
|
hide-env VENV_OLD_PATH
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user