[英]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 時附帶的部分舊版本。
我相信這篇博文可能非常有用:
在 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 可執行文件。
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
shell.nix
文件可以啟動復雜的開發環境,調用nix-shell shell.nix
將處理所有問題 - 如果使用direnv
( archived ) 設置,即使在進入目錄時也會自動執行。
這將使您進入一個帶有erl
和rebar3
的 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.