Wiele programów zwraca numer wersji za pomocą polecenia:
$ program --version
program (platform info) v1.2.3
Jest to przydatne do tworzenia skryptów instalacji lub konserwacji programu i innych kontrolowanych magii automatyzacji od administratorów systemu i przyjaciół.
Problem
Jak łatwo uzyskać numer wersji dla Erlang (OTP) ?
W sieci
Oto kilka niezadowalających rozwiązań ([1] i inne samouczki / dokumentacja Erlang):
Emulator
$ erl
1> erlang:system_info(otp_release).
"R13B03"
Trudne do napisania. Nie znalazłem sposobu na erl
wykonanie pojedynczego polecenia z wiersza poleceń powłoki.
Plik wydania
$ cat /usr/lib/erlang/releases/RELEASES
[{release,"OTP APN 181 01","R13B03","5.7.4",
[{kernel,"2.13.4","/usr/lib/erlang/lib/kernel-2.13.4"},
{stdlib,"1.16.4","/usr/lib/erlang/lib/stdlib-1.16.4"},
{sasl,"2.1.8","/usr/lib/erlang/lib/sasl-2.1.8"}],
permanent}].
Parsing paradise (with shell).
Alternatywą może być również sprawdzenie ścieżki instalacji, ale nie jest to przenośne (moja ścieżka instalacji nie obejmuje wersji).
Kontekst osobisty: piszę skrypt, aby zainstalować tę samą wersję RabbitMQ z wtyczkami na kilku komputerach. Niektóre wtyczki mają minimalne wymagania dotyczące wersji OTP i od tego zaczęło się to pytanie.
Odpowiedzi:
źródło
(no error logger present) error: "Error in process <0.0.0>
w systemie Windows 7 dla mnie. -17.0.2
), a nie samego erlang (18
w moim przypadku).erl -eval "erlang:display(erlang:system_info(otp_release)), halt()." -noshell
Pozostałe odpowiedzi wyświetlają tylko wersję główną od OTP 17 (z docs dla erlang: system_info ). Działa to w celu wyświetlenia wersji głównej i pobocznej na moim komputerze deweloperskim:
Odczytuje się z odpowiedniego pliku, zgodnie z opisem w dokumentacji .
źródło
\n
, a także uczynić kod krótszy z tylko jedną zmianą:erl -eval '{ok, Version} = file:read_file(filename:join([code:root_dir(), "releases", erlang:system_info(otp_release), "OTP_VERSION"])), io:fwrite(Version), halt().' -noshell
.erl -eval "{ok, Version} = file:read_file(filename:join([code:root_dir(), 'releases', erlang:system_info(otp_release), 'OTP_VERSION'])), io:fwrite(Version), halt()." -noshell
(Dodaję tę odpowiedź tutaj, ponieważ szukałem jej co najmniej 3 razy w ciągu ostatnich trzech miesięcy)
Począwszy od wersji 17.0, wydania mają nowy format numeru wersji (17.0, 17.1, ...), ale
erlang:system_info(otp_release).
zwraca tylko główny numer wersji.W celu uzyskania pełnego numeru wersji należy sprawdzić zawartość
OTP_RELEASE
pliku we wspomnianymreleases
folderze.EDYTOWAĆ
źródło
find / -name "OTP_RELEASE"
też go nie widzę, ale mam zainstalowany OTP 17.x. Skąd mam wiedzieć, co to jest „x”?OTP_VERSION
.cat $(dirname $(dirname `which erl`)/$(readlink `which erl`))/../releases/*/OTP_*
init docs , połączone przez „man erl”.
A zatem,
źródło
eval
słowa kluczowego w instrukcji?Aby pobrać wersję EShell (Erlang Shell), możesz użyć:
i pobrać wersję Erlang OTP ( Open Telecom Platform ):
źródło
Znaleźć w
/usr/lib/erlang/releases/18/OTP_VERSION
źródło
18.2.1
./usr/lib/erlang/releases
- zainstalowany przez ansibleerl + V lub możesz użyć erl -version
wynik: emulator Erlang (SMP, ASYNC_THREADS) (BEAM) wersja 5.8.5
źródło
erl
wersję emulatora, a nie numer wersji programu Erlang (np. „R15B03”). Wszystko to mogłoby być takie proste ;-)Znajduje erl w twojej PATH i odczytuje plik RELEASES, aby wyodrębnić numer wydania erlang.
źródło
Otwórz terminal i wprowadź polecenie erl
Otrzymasz następujące dane wyjściowe:
Erlang R16B03 (erts-5.10.4) [źródło] [64-bit] [smp: 4: 4] [async-thread: 10] [kernel-poll: false] Eshell V5.10.4 (przerwij za pomocą ^ G)
Erlang R16B03 (erts-5.10.4) [źródło] [64-bit] [smp: 4: 4] [async-thread: 10] [kernel-poll: false] - to jest wersja językowa
Eshell V5.10.4 (przerwij za pomocą ^ G) - to jest wersja powłoki
źródło
Na podstawie powyższej odpowiedzi Jaya napisałem następującą funkcję powłoki, której mogę użyć:
Często zapominam, że polecenie jest
erl
raczej niżerlang
, więc pozwala mojemu zapominalskiemu mózgowi używaćerlang
tak, jakby byłoerl
, ierlang -v
tak , jak oczekiwałbym od czegoś takiegoelixir
.źródło
Proste polecenie, którego możesz użyć:
źródło