Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add command to generate bootstrap and activate scripts #34

Open
jfchenier opened this issue May 18, 2023 · 4 comments
Open

Add command to generate bootstrap and activate scripts #34

jfchenier opened this issue May 18, 2023 · 4 comments
Labels
enhancement New feature or request

Comments

@jfchenier
Copy link

This is more of a feature request than a bug, feel free to close the issue if it falls outside the current scope.

Currently, when utilizing this extension and including the environment.yml file in a project, the user is restricted to controlling the environment solely within VSCode. It would be highly beneficial to have a command within the extension that generates a script enabling the initialization and activation of the virtual environment outside of the VSCode environment. This enhancement would greatly enhance flexibility and convenience for users.

@corker corker added the enhancement New feature or request label May 19, 2023
@goyalyashpal
Copy link

umh, micromamba activate <env_name>?

@jfchenier
Copy link
Author

jfchenier commented Jul 24, 2023

umh, micromamba activate <env_name>?

It is a bit more complicated than that if the user doesn't have a global installation of Micromamba. The shell init script must also get called. Here is what I use on my side for the activation :

if test -n "$BASH"; then
  SOURCE=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
elif test -n "$ZSH_NAME"; then
  SOURCE="$( dirname -- "$( readlink -f -- "$0"; )"; )"
else
  echo 'Error : Unable to detect shell. Only bash and zsh are supported'
  return 1
fi

ENV_FILE_PATH="$PROJECT_ROOT/environment.yml"

# Read project name from environment file.
PROJECT_NAME="$( grep '^name:' $ENV_FILE_PATH | sed 's/^name: //' )"

export MAMBA_ROOT_PREFIX=$SOURCE/.micromamba
export MAMBA_EXE="$MAMBA_ROOT_PREFIX/micromamba"

eval "$($MAMBA_ROOT_PREFIX/micromamba shell hook --shell=posix)"

if command -v micromamba &> /dev/null; then
    micromamba activate $PROJECT_NAME
else
    echo 'Error : Unable to activate environment.'
    return 1
fi

For the environment creation, the script must also download Micromamba.

PATH="$HOME/.local/bin:$PATH"

if test -n "$BASH"; then
  SOURCE=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
elif test -n "$ZSH_NAME"; then
  SOURCE="$( dirname -- "$( readlink -f -- "$0"; )"; )"
else
  echo 'Error : Unable to detect shell. Only bash and zsh are supported'
  return 1
fi

PROJECT_ROOT="$SOURCE"
export PROJECT_ROOT

OS=$(uname -s | tr '[:upper:]' '[:lower:]')

export MAMBA_ROOT_PREFIX="$SOURCE/.micromamba"
export MAMBA_EXE="$MAMBA_ROOT_PREFIX/micromamba"

ENV_FILE_PATH="$PROJECT_ROOT/environment.yml"

# Read project name from environment file.
PROJECT_NAME="$( grep '^name:' $ENV_FILE_PATH | sed 's/^name: //' )"

if [ -z "$PROJECT_NAME" ]; then
   echo 'Error : Unable to detect project name. Please check the environment file.'
   return 1
fi

if ! [ -f $MAMBA_ROOT_PREFIX/micromamba ]; then
   mkdir -p $MAMBA_ROOT_PREFIX/etc/profile.d

   echo 'Downloading Micromamba ...'
   cd $MAMBA_ROOT_PREFIX

   if [ $OS = "darwin" ]; then
      if [ "$(uname -m)" = "x86_64" ]; then
         curl -Ls https://micro.mamba.pm/api/micromamba/osx-64/1.0.0 | tar -xvj --strip-components=1 -C . bin/micromamba
      else
         curl -Ls https://micro.mamba.pm/api/micromamba/osx-arm64/1.0.0 | tar -xvj --strip-components=1 -C . bin/micromamba
      fi
   elif [ $OS = "linux" ]; then
      if [ "$(uname -m)" = "x86_64" ]; then
         curl -Ls https://micro.mamba.pm/api/micromamba/linux-64/1.0.0 | tar -xvj --strip-components=1 -C . bin/micromamba
      else
         echo 'Error : Unsupported system'
         return 1
      fi
   else
      echo 'Error : Unsupported system'
      return 1
   fi
   cd -

   eval "$(.micromamba/micromamba shell hook --shell=posix)"
   printf '%s\n' "$(.micromamba/micromamba shell hook --shell=posix)" > $MAMBA_ROOT_PREFIX/etc/profile.d/micromamba.sh

   touch $MAMBA_ROOT_PREFIX/.env.$PROJECT_NAME
fi

if command -v micromamba &> /dev/null; then
   #init micromamba environment.
   micromamba create -y --file $ENV_FILE_PATH
   micromamba activate $PROJECT_NAME
else
   echo 'Error : micromamba not installed properly'
   return 1
fi

return 0

I haven't figured out yet how to generate the same environment variables than the extension for the .env.{env_name} file. I would really like to help more to develop this feature, but I really lack typescript skills. (I am en embedded developer).

If there is some interest, I can provide the scripts for windows too.

@goyalyashpal
Copy link

goyalyashpal commented Jul 24, 2023

oh, you are talking about linux environment??

If there is some interest, I can provide the scripts for windows too.

well, i don't think there's a need for this. on windows, it's just a standalone file - i put-ed it anywhere, entered it in $PATH environment variable (system wide), and it runs fine....

(i am using msys2 to use bash)

$ micromamba activate facerecog_env
critical libmamba Shell not initialized

'micromamba' is running as a subprocess and can't modify the parent shell.
Thus you must initialize your shell before using activate and deactivate. 

To initialize the current bash shell, run:
    $ eval "$(micromamba shell hook --shell bash)"
and then activate or deactivate with:
    $ micromamba activate
To automatically initialize all future (bash) shells, run:
    $ micromamba shell init --shell bash --root-prefix=~/micromamba
If your shell was already initialized, reinitialize your shell with:
    $ micromamba shell reinit --shell bash
Otherwise, this may be an issue. In the meantime you can run commands. See:
    $ micromamba run --help

Supported shells are {bash, zsh, csh, xonsh, cmd.exe, powershell, fish}.

$ eval "$(micromamba shell hook --shell bash)"

$ micromamba activate facerecog_env
warning  libmamba 'root_prefix' set with default value: C:\Users\...\micromamba
(facerecog_env)
$ 

@corker
Copy link
Collaborator

corker commented Aug 5, 2023

We don't need micromamba to activate the environment when we want to activate an environment created by the extension.
A .env.<name> file is generated when the environment is created. To activate the environment, we could set environment variables from the .env.<name> file.
I'm trying to figure out how to make it convenient and simple for users in all those different terminal types and can't see it yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants