簡體   English   中英

在一台機器上安裝多個版本的 Erlang/OTP

[英]Installing more than one version of Erlang/OTP on a machine

是否可以在同一平台上同時安裝不同版本的 Erlang/OTP?

我使用Kerl在我的機器上安裝 Erlang。 非常易於使用,並允許在同一台機器上安裝多個 Erlang 系統。 然后,您可以輕松選擇要使用的那個。

是的,我通常在我的主目錄中安裝不同的版本。 我從源代碼構建它們:

./configure --prefix=$HOME/r15b01
make && make install

然后我可以選擇一個版本與PATH=$HOME/r15b01/bin:$PATH ,然后像往常一樣編譯和運行。


這些天我為此使用asdf 安裝asdf並將相關行添加到您的.bashrc ,然后運行:

asdf plugin add erlang
asdf install erlang 22.3.3
asdf install erlang 23.0.2

然后,您可以將剛剛構建的 Erlang 版本之一設置為默認版本:

asdf global erlang 23.0.2

或者您可以將其設置為在當前目錄及其子目錄中使用 - 這將在當前目錄中創建一個.tool-versions文件:

asdf local erlang 22.3.3

它不僅可能,而且非常頻繁。 在我的機器上,我安裝了一個用於開發的版本 (R13B03),它是我啟動 erl 時的默認版本。 與氮相關的相同版本的第二個副本。 當我啟動我的氮網站時使用此副本。 當我將使用 R16B.. 進行開發時,版本不會改變。安裝 Wings3D 時附帶的部分舊版本。

我相信這篇博文可能非常有用:

如何管理多個Erlang安裝

在 Mac 上,Macport 有助於切換,即使在它涵蓋的版本和較新的版本之間也是如此。

例如,直接從 Erlang Solutions 安裝 Erlang 17,您可以切換回 RB1603(之后打開一個新的終端窗口):

sudo port activate erlang @R16B03-1_0+hipe+ssl

通過 _de_activation 安裝 Macports 切換回 Erlang 17(然后打開一個新的終端窗口):

sudo port deactivate erlang @R16B03-1_0+hipe+ssl

列出您安裝的所有版本:

port installed erlang

使用Nix 包管理器不需要全局安裝解釋器(尤其是因為有時需要多個版本),並且nix-shell將打開一個子 shell,其中包含路徑中可用的 Erlang 可執行文件。

1. 只獲取 Erlang(沒有shell.nix

對於活動頻道中的當前版本:

nix-shell -p erlang

對於不在當前頻道中的其他版本,可以給出特定的頻道:

nix-shell -I nixpkgs=channel:nixos-unstable -p erlangR22

或者在NixOS/nixpkgs克隆中添加 Nix 表達式的路徑:

$ nix-shell -I nixpkgs=~/clones/nixpkgs -p erlangR23

2.更精細的項目設置配置:使用shell.nix文件

可以啟動復雜的開發環境,調用nix-shell shell.nix將處理所有問題 - 如果使用direnv ( archived ) 設置,即使在進入目錄時也會自動執行

2.1 例子

二郎

這將使您進入一個帶有erlrebar3的 shell,以及在buildInputs指定的其他程序。

####################################################################
# Importing a cloned Nixpkgs repo  (from my home directory), because
# the latest channels don't have Elixir 1.9.
# See https://nixos.org/nix/manual/#idm140737317975776 for the meaning
# of `<nixpkgs>` and `~` in Nix expressions (towards the end of that
# section).
####################################################################

{ pkgs ? import ~/clones/nixpkgs {} }:

pkgs.mkShell {

  buildInputs = with pkgs; [
    beam.packages.erlangR22.elixir_1_9
    postgresql_11
    nodejs-12_x
    git
    inotify-tools
  ];

  shellHook = ''

    ####################################################################
    # Create a diretory for the generated artifacts
    ####################################################################

    mkdir .nix-shell
    export NIX_SHELL_DIR=$PWD/.nix-shell

    ####################################################################
    # Put the PostgreSQL databases in the project diretory.
    ####################################################################

    export PGDATA=$NIX_SHELL_DIR/db

    ####################################################################
    # Put any Mix-related data in the project directory
    ####################################################################

    export MIX_HOME="$NIX_SHELL_DIR/.mix"
    export MIX_ARCHIVES="$MIX_HOME/archives"

    ####################################################################
    # Clean up after exiting the Nix shell using `trap`.
    # ------------------------------------------------------------------
    # Idea taken from
    # https://unix.stackexchange.com/questions/464106/killing-background-processes-started-in-nix-shell
    # and the answer provides a way more sophisticated solution.
    #
    # The main syntax is `trap ARG SIGNAL` where ARG are the commands to
    # be executed when SIGNAL crops up. See `trap --help` for more.
    ####################################################################

    trap \
      "
        ######################################################
        # Stop PostgreSQL
        ######################################################

        pg_ctl -D $PGDATA stop

        ######################################################
        # Delete `.nix-shell` directory
        # ----------------------------------
        # The first  step is going  back to the  project root,
        # otherwise `.nix-shell`  won't get deleted.  At least
        # it didn't for me when exiting in a subdirectory.
        ######################################################

        cd $PWD
        rm -rf $NIX_SHELL_DIR
      " \
      EXIT

    ####################################################################
    # If database is  not initialized (i.e., $PGDATA  directory does not
    # exist), then set  it up. Seems superfulous given  the cleanup step
    # above, but handy when one gets to force reboot the iron.
    ####################################################################

    if ! test -d $PGDATA
    then

      ######################################################
      # Init PostgreSQL
      ######################################################

      pg_ctl initdb -D  $PGDATA

      ######################################################
      # PORT ALREADY IN USE
      ######################################################
      # If another `nix-shell` is  running with a PostgreSQL
      # instance,  the logs  will show  complaints that  the
      # default port 5432  is already in use.  Edit the line
      # below with  a different  port number,  uncomment it,
      # and try again.
      ######################################################

      # sed -i "s|^#port.*$|port = 5433|" $PGDATA/postgresql.conf

    fi

    ####################################################################
    # Start PostgreSQL
    # ==================================================================
    # Setting all  necessary configuration  options via  `pg_ctl` (which
    # is  basically  a wrapper  around  `postgres`)  instead of  editing
    # `postgresql.conf` directly with `sed`. See docs:
    #
    # + https://www.postgresql.org/docs/current/app-pg-ctl.html
    # + https://www.postgresql.org/docs/current/app-postgres.html
    #
    # See more on the caveats at
    # https://discourse.nixos.org/t/how-to-configure-postgresql-declaratively-nixos-and-non-nixos/4063/1
    # but recapping out of paranoia:
    #
    # > use `SHOW`  commands to  check the  options because  `postgres -C`
    # > "_returns values  from postgresql.conf_" (which is  not changed by
    # > supplying  the  configuration options  on  the  command line)  and
    # > "_it does  not reflect  parameters supplied  when the  cluster was
    # > started._"
    #
    # OPTION SUMMARY
    # --------------------------------------------------------------------
    #
    #  + `unix_socket_directories`
    #
    #    > PostgreSQL  will  attempt  to create  a  pidfile  in
    #    > `/run/postgresql` by default, but it will fail as it
    #    > doesn't exist. By  changing the configuration option
    #    > below, it will get created in $PGDATA.
    #
    #   + `listen_addresses`
    #
    #     > In   tandem  with   edits   in  `pg_hba.conf`   (see
    #     > `HOST_COMMON`  below), it  configures PostgreSQL  to
    #     > allow remote connections (otherwise only `localhost`
    #     > will get  authenticated and the rest  of the traffic
    #     > discarded).
    #     >
    #     > NOTE: the  edit  to  `pga_hba.conf`  needs  to  come
    #     >       **before**  `pg_ctl  start`  (or  the  service
    #     >       needs to be restarted otherwise), because then
    #     >       the changes are not being reloaded.
    #     >
    #     > More info  on setting up and  troubleshooting remote
    #     > PosgreSQL connections (these are  all mirrors of the
    #     > same text; again, paranoia):
    #     >
    #     >   + https://stackoverflow.com/questions/24504680/connect-to-postgres-server-on-google-compute-engine
    #     >   + https://stackoverflow.com/questions/47794979/connecting-to-postgres-server-on-google-compute-engine
    #     >   + https://medium.com/scientific-breakthrough-of-the-afternoon/configure-postgresql-to-allow-remote-connections-af5a1a392a38
    #     >   + https://gist.github.com/toraritte/f8c7fe001365c50294adfe8509080201#file-configure-postgres-to-allow-remote-connection-md

    HOST_COMMON="host\s\+all\s\+all"
    sed -i "s|^$HOST_COMMON.*127.*$|host all all 0.0.0.0/0 trust|" $PGDATA/pg_hba.conf
    sed -i "s|^$HOST_COMMON.*::1.*$|host all all ::/0 trust|"      $PGDATA/pg_hba.conf

     #  + `log*`
     #
     #    > Setting up basic logging,  to see remote connections
     #    > for example.
     #    >
     #    > See the docs for more:
     #    > https://www.postgresql.org/docs/current/runtime-config-logging.html

    pg_ctl                                                  \
      -D $PGDATA                                            \
      -l $PGDATA/postgres.log                               \
      -o "-c unix_socket_directories='$PGDATA'"             \
      -o "-c listen_addresses='*'"                          \
      -o "-c log_destination='stderr'"                      \
      -o "-c logging_collector=on"                          \
      -o "-c log_directory='log'"                           \
      -o "-c log_filename='postgresql-%Y-%m-%d_%H%M%S.log'" \
      -o "-c log_min_messages=info"                         \
      -o "-c log_min_error_statement=info"                  \
      -o "-c log_connections=on"                            \
      start

    ####################################################################
    # Install Node.js dependencies if not done yet.
    ####################################################################

    if test -d "$PWD/assets/" && ! test -d "$PWD/assets/node_modules/"
    then
      (cd assets && npm install)
    fi

    ####################################################################
    # If $MIX_HOME doesn't exist, set it up.
    ####################################################################

    if ! test -d $MIX_HOME
    then

      ######################################################
      # ...  but first,  test whether  there is  a `_backup`
      # directory. Had issues with  installing Hex on NixOS,
      # and Hex and  Phoenix can be copied  from there, just
      # in case.
      ######################################################

      if test -d "$PWD/_backup"
      then
        cp -r _backup/.mix .nix-shell/
      else
        ######################################################
        # Install Hex and Phoenix via the network
        ######################################################

        yes | mix local.hex
        yes | mix archive.install hex phx_new
      fi
    fi

    if test -f "mix.exs"
    then
      # These are not in the  `if` section above, because of
      # the `hex` install glitch, it  could be that there is
      # already a `$MIX_HOME` folder. See 2019-08-05_0553

      mix deps.get

      ######################################################
      # `ecto.setup` is defined in `mix.exs` by default when
      # Phoenix  project  is  generated via  `mix  phx.new`.
      # It  does  `ecto.create`,   `ecto.migrate`,  and  run
      # `priv/seeds`.
      ######################################################
      mix ecto.setup
    fi
  '';

  ####################################################################
  # Without  this, almost  everything  fails with  locale issues  when
  # using `nix-shell --pure` (at least on NixOS).
  # See
  # + https://github.com/NixOS/nix/issues/318#issuecomment-52986702
  # + http://lists.linuxfromscratch.org/pipermail/lfs-support/2004-June/023900.html
  ####################################################################

  LOCALE_ARCHIVE = if pkgs.stdenv.isLinux then "${pkgs.glibcLocales}/lib/locale/locale-archive" else "";
}
Elixir/Phoenix 網絡項目

已存檔)將為 Elixir/Phoenix Web 應用程序設置一個環境,其中包含一個啟動的 PostgreSQL 開發實例:

$ nix-env -f ~/clones/nixpkgs/ -qaP 'erlang*'
# ...
nixos.erlangR20            erlang-20.3.8.9
nixos.erlangR21            erlang-21.3.8.3
nixos.erlang               erlang-22.1.7
# ...
=== >>> erlangR23            erlang-23.0.2  <<<====

如何在控制台上查找具有屬性路徑的包

$ nix-env -qaP 'erlang*' # ... nixos.erlangR20 erlang-20.3.8.9 nixos.erlangR21 erlang-21.3.8.3 nixos.erlang erlang-22.1.7 # ...
 $ nix-env -f ~/clones/nixpkgs/ -qaP 'erlang*' # ... nixos.erlangR20 erlang-20.3.8.9 nixos.erlangR21 erlang-21.3.8.3 nixos.erlang erlang-22.1.7 # ... === >>> erlangR23 erlang-23.0.2 <<<====

考慮使用內核。 它允許您使用多個 Erlang 安裝https://github.com/kerl/kerl

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM