A way to get the exact OTP_VERSION w/o using a dependency?

Before I propose this to the core team via mailing list, does anyone know of the incantation to get the exact OTP version? I’ve found otp_version and I see that –short-version will land in 1.13, but I’d really like to see the actual OTP_VERSION.

iex(1)> System.version()
"1.12.1"
iex(2)> System.otp_release()
"24"
iex(3)> System.build_info()
%{
  build: "1.12.1 (compiled with Erlang/OTP 24)",
  date: "2021-05-28T16:00:08Z",
  otp_release: "24",
  revision: "42807d2",
  version: "1.12.1"
}
iex(4)> :erlang.system_info(:otp_release)
'24'

My motivation is that there can be a discrepancy between what I have in .tool-versions and what’s installed in a Docker container and I’d like CI to fail if versions don’t match. Ideally CI would fail quickly with a bash script in the test pipeline instead of needing to compile the whole project.

Thanks!

3 Likes

This is what mix hex.info uses:

5 Likes

Here is some documentation about it:
Retrieving current OTP version

The elixir version would look something like this:

[:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"] 
|> Path.join() 
|> File.read!() 
|> String.trim()
2 Likes

Thanks, that should work for now. Is there any appetite for having this exposed via elixir --otp-version?

You’d have to ask the core team but I’m pretty sure the answer would be no unless there’s a proper API in OTP for it, I imagine something like :erlang.system_info(:otp_version) would be one idea how this could be exposed. But yeah, the versioning is tricky as described in one of the links above.

1 Like