Elixir v1.15.0 released

Yep, looks like it is working fine under OTP 25 and Elixir 1.15. So it must be something in OTP 26. I’ll look into reporting it to amqp_client. Thanks.

1 Like

Would doing this in a library (swoosh) cause any issue to end user?

I am almost sure it cannot be done in a library (the manager option is not pushed to Hex) but please try to confirm.

We ran into similar issues that we were able to fix by upgrading to the latest version of ampq_client 3.12.0

1 Like

Hi, I have tried v1.15.0 today for my project.

Migration process from 1.14.4-otp-25 went smoothly - everything compiled successfully. It required only small fixes for logger. Thank you for this!

I have tried to debug the tests from the shell, but debugger did not stop on the breakpoint.
I have noticed, that there were changes with IEx module, so I have tried these things:

  • launch tests with iex -S mix test and iex --dbg pry -S mix test.
  • added breakpoints with dbg() and require IEx; IEx.pry.

I got only this message instead of breakpoint.

Cannot pry #PID<0.145.0> at TestTest."test greets the world"/1 (test/test_test.exs:6). Is an IEx shell running?

I got this issue on otp-25, but it worked fine for otp-26. I did not update the OTP yet, because it breaks my elixir-ls setup now.

Debugger works fine for both otp-25 and otp-26, when I add breakpoints to my Phoenix application, for both iex -S mix phx.server and iex --dbg pry -S mix phx.server.

Steps to reproduce:

  1. Use Erlang 25.3.2, or 25.3.2.2 and Elixir 1.15.0.
  2. Create new mix project mix new test.
  3. Add breakpoints to the test/test_test.exs file, like these:
defmodule TestTest do
  use ExUnit.Case
  doctest Test

  test "greets the world" do
    require IEx; IEx.pry
    dbg()
    assert Test.hello() == :world
  end
end
  1. Run tests with either iex --dbg pry -S mix test or iex -S mix test.

Are there any workarounds for this? Possibly I am not aware of something.

1 Like

Can you please open up an issue? Erlang/OTP 26 changed how IEx boots and I have been trying to juggle the system that initializes both and I probably messed something up on earlier Erlang versions. :slight_smile:

I think though a new Erlang/OTP 26 version will be out soon, which means Elixir LS will get back to working. :slight_smile:

3 Likes

Thank you for a quick response and for your fantastic work.
I have created this issue: Debugger does not stop at the breakpoints in tests for Elixir 1.15.0 on OTP 25 · Issue #12687 · elixir-lang/elixir · GitHub

Looking forward to the Elixir LS fixes :slight_smile:

1 Like

I am running into an issue with Logger in tests, but still investigating. It appears that capture_log stops working somewhere in the middle of test suite and it’s because this happens:

Logger - error: {removed_failing_handler,'Elixir.ExUnit.CaptureServer'}

I suspect this is because there’s somewhere in one of the libraries call to Logger.warn and this crashes on this line.

I’ll write a test case and submit bug report to Elixir lang

1 Like

Yes, please. We already fixed a similar bug during RC, so perhaps a slightly different one.

Thank you for your work on the release!

Does anyone else have issues with releases and Ecto’s optional dependencies? After updating to 1.15.0-otp-26, when trying to assemble the release I get the following error:

** (Mix) Could not find application :myxql

When I add the dependency, I get the same with tds

 mix release ek

** (Mix) Could not find application :tds

Only after I add them manually to the mix.exs the release work.

Note that we don’t use MySQL. Running the app locally without those dependencies renders no issues - it’s the release step only.

Everything is on the latest:

❯ mix hex.outdated
Dependency              Current  Latest  Status
appsignal               2.7.5    2.7.5   Up-to-date
appsignal_phoenix       2.3.3    2.3.3   Up-to-date
bcrypt_elixir           3.0.1    3.0.1   Up-to-date
credo                   1.7.0    1.7.0   Up-to-date
decimal                 2.1.1    2.1.1   Up-to-date
dialyxir                1.3.0    1.3.0   Up-to-date
ecto_psql_extras        0.7.11   0.7.11  Up-to-date
ecto_sql                3.10.1   3.10.1  Up-to-date
esbuild                 0.7.0    0.7.0   Up-to-date
ex_cldr_calendars       1.22.0   1.22.0  Up-to-date
floki                   0.34.3   0.34.3  Up-to-date
fun_with_flags          1.10.1   1.10.1  Up-to-date
fun_with_flags_ui       0.8.1    0.8.1   Up-to-date
gettext                 0.22.2   0.22.2  Up-to-date
google_api_compute      0.53.0   0.53.0  Up-to-date
goth                    1.4.0    1.4.0   Up-to-date
hackney                 1.18.1   1.18.1  Up-to-date
horde                   0.8.7    0.8.7   Up-to-date
jason                   1.4.0    1.4.0   Up-to-date
libcluster              3.3.2    3.3.2   Up-to-date
libcluster_gig          0.3.1    0.3.1   Up-to-date
logger_json             5.1.2    5.1.2   Up-to-date
mime                    2.0.5    2.0.5   Up-to-date
mix_audit               2.1.0    2.1.0   Up-to-date
oban                    2.15.1   2.15.1  Up-to-date
oban_web                2.9.7    2.9.7   Up-to-date
observer_cli            1.7.4    1.7.4   Up-to-date
phoenix                 1.7.6    1.7.6   Up-to-date
phoenix_ecto            4.4.2    4.4.2   Up-to-date
phoenix_html            3.3.1    3.3.1   Up-to-date
phoenix_live_dashboard  0.8.0    0.8.0   Up-to-date
phoenix_live_reload     1.4.1    1.4.1   Up-to-date
phoenix_live_view       0.19.2   0.19.2  Up-to-date
plug_cowboy             2.6.1    2.6.1   Up-to-date
postgrex                0.17.1   0.17.1  Up-to-date
sentry                  8.0.6    8.0.6   Up-to-date
sobelow                 0.12.2   0.12.2  Up-to-date
swoosh                  1.11.2   1.11.2  Up-to-date
tailwind                0.2.0    0.2.0   Up-to-date
telemetry_metrics       0.6.1    0.6.1   Up-to-date
telemetry_poller        1.0.0    1.0.0   Up-to-date
tesla                   1.7.0    1.7.0   Up-to-date
tz                      0.26.2   0.26.2  Up-to-date
ueberauth               0.10.5   0.10.5  Up-to-date
ueberauth_google        0.10.2   0.10.2  Up-to-date
vapor                   0.10.0   0.10.0  Up-to-date

mix.exs

defmodule EK.MixProject do
  use Mix.Project

  def project do
    [
      app: :ek,
      version: "0.1.0",
      elixir: "~> 1.14",
      elixirc_paths: elixirc_paths(Mix.env()),
      compilers: Mix.compilers(),
      start_permanent: Mix.env() == :prod,
      aliases: aliases(),
      deps: deps(),
      test_coverage: [
        summary: [
          threshold: 80
        ]
      ],
      dialyzer: [
        ignore_warnings: ".dialyzer.ignore",
        plt_local_path: "priv/plt/",
        plt_core_path: "priv/plt/",
        plt_add_apps: [
          :ek,
          :fun_with_flags,
          :fun_with_flags_ui,
          :observer_cli,
          :mix
        ]
      ],
      releases: [
        ek: [
          include_erts: true,
          include_executables_for: [:unix],
          applications: [
            ek: :permanent,
            fun_with_flags: :load,
            fun_with_flags_ui: :load
          ]
        ]
      ]
    ]
  end

  # Configuration for the OTP application.
  #
  # Type `mix help compile.app` for more information.
  def application do
    [
      mod: {EK.Application, []},
      extra_applications: [:logger, :runtime_tools, :os_mon],
      start_phases: [
        migrate_feature_flags: [],
        create_initial_admin_user: [],
        start_sync_processes: []
      ]
    ]
  end

  # Specifies which paths to compile per environment.
  defp elixirc_paths(:test), do: ["lib", "test/support"]
  defp elixirc_paths(_), do: ["lib"]

  # Specifies your project dependencies.
  #
  # Type `mix help deps` for examples and options.
  defp deps do
    [
      {:phoenix, "~> 1.7.2"},
      {:phoenix_ecto, "~> 4.4"},
      {:ecto_sql, "~> 3.6"},
      {:postgrex, ">= 0.0.0"},
      {:phoenix_html, "~> 3.3"},
      {:phoenix_live_reload, "~> 1.2", only: :dev},
      {:phoenix_live_view, "~> 0.19.0", override: true},
      {:floki, ">= 0.30.0", only: :test},
      {:phoenix_live_dashboard, "~> 0.8"},
      {:swoosh, "~> 1.3"},
      {:telemetry_metrics, "~> 0.6"},
      {:telemetry_poller, "~> 1.0"},
      {:gettext, "~> 0.18"},
      {:jason, "~> 1.2"},
      {:plug_cowboy, "~> 2.5"},
      {:goth, "~> 1.4.0"},
      {:libcluster, "~> 3.3.0"},
      {:libcluster_gig, "~> 0.3.1"},
      {:google_api_compute, "~> 0.41"},
      {:vapor, "~> 0.10.0"},
      {:fun_with_flags, "~> 1.10.1", runtime: false},
      {:fun_with_flags_ui, "~> 0.8.1", runtime: false},
      {:ueberauth, "~> 0.7"},
      {:ueberauth_google, "~> 0.10"},
      {:oban, "~> 2.10"},
      {:oban_web, "~> 2.9", repo: "oban"},
      {:hackney, "~> 1.18.0"},
      {:tesla, "~> 1.4"},
      {:logger_json, "~> 5.0"},
      {:mime, "~> 2.0.3"},
      {:bcrypt_elixir, "~> 3.0"},
      {:ecto_psql_extras, "~> 0.7"},
      {:appsignal, "~> 2.7.0"},
      {:appsignal_phoenix, "~> 2.3.1"},
      {:horde, "~> 0.8.7"},
      {:observer_cli, "~> 1.7"},
      {:sentry, "~> 8.0.6"},
      {:decimal, "~> 2.0"},
      {:tz, "~> 0.26.1"},
      {:ex_cldr_calendars, "~> 1.22.0"},
      {:esbuild, "~> 0.4", runtime: Mix.env() == :dev},
      {:tailwind, "~> 0.2.0", runtime: Mix.env() == :dev},
      {:credo, "~> 1.7.0", only: [:dev, :test], runtime: false},
      {:dialyxir, "~> 1.0", only: [:dev], runtime: false},
      {:sobelow, "~> 0.12.2", only: [:dev], runtime: false},
      {:mix_audit, "~> 2.1.0", only: [:dev, :test], runtime: false, override: true}
    ]
  end

  # Aliases are shortcuts or tasks specific to the current project.
  # For example, to install project dependencies and perform other setup tasks, run:
  #
  #     $ mix setup
  #
  # See the documentation for `Mix` for more info on aliases.
  defp aliases do
    [
      setup: ["deps.get", "ecto.setup"],
      "dev.dashboard_db_seed": ["run priv/dashboard_repo/seeds.exs"],
      "ecto.setup": ["ecto.create", "ecto.migrate", "dev.dashboard_db_seed"],
      "ecto.reset": ["ecto.drop", "ecto.setup"],
      "ecto.reset_no_seed": ["ecto.drop", "ecto.create", "ecto.migrate"],
      test: ["ecto.create --quiet", "ecto.migrate --quiet", "test"],
      "assets.setup": ["tailwind.install --if-missing", "esbuild.install --if-missing"],
      "assets.build": ["tailwind default", "esbuild default"],
      "assets.deploy": ["tailwind default --minify", "esbuild default --minify", "phx.digest"],
      sentry_recompile: ["deps.compile sentry --force"]
    ]
  end
end

EDIT: Added our mix.exs

1 Like

I could assemble a release with Ecto + EctoSQL + Postgrex without running into issues.

1 Like

I assumed it was a log with level :warn sneaking in somewhere but no, the problem is different. I am still trying to pinpoint what’s going on, but the issue disappears completely with --max-cases=1, and then gradually starts to show up as I increase the concurrency of tests. At --max-cases=6 it’s almost always guaranteed to happen in my test suite.

Edit: I opened a bug report here: ExUnit.CaptureLog fails in tests on high concurrency · Issue #12692 · elixir-lang/elixir · GitHub we can move conversation there

1 Like

Thank you for testing it.

I found that the issue is probably connected to fun_with_flags, specifically when runtime: false is used. It works with Elixir 1.14.5-otp-26.

I was able to replicate a minimal app that causes the issue:

mix new ek --sup --module EK

and then use the following mix.exs as is:

defmodule EK.MixProject do
  use Mix.Project

  def project do
    [
      app: :ek,
      version: "0.1.0",
      elixir: "~> 1.15",
      start_permanent: Mix.env() == :prod,
      deps: deps(),
      releases: [
        ek: [
          include_erts: true,
          include_executables_for: [:unix],
          applications: [
            ek: :permanent,
            fun_with_flags: :load
          ]
        ]
      ]
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger],
      mod: {EK.Application, []}
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      {:ecto_sql, "~> 3.6"},
      {:postgrex, ">= 0.0.0"},
      {:fun_with_flags, "~> 1.10.1", runtime: false}
    ]
  end
end
❯ mix release ek
Generated ek app
** (Mix) Could not find application :myxql

I am now trying to figure out what’s wrong :slight_smile:

Can you please open up an issue with pretty much what you have here? So I don’t forget about it and then I can investigate it as soon as possible. Thank you!

Thank you @josevalim v1.15.0: Unable to assemble the release - optional dependencies (applications) are missing · Issue #12694 · elixir-lang/elixir · GitHub

I was unable to determine on which side the problem might be.

1 Like

I just tried the new version today.

First issue as other mentioned before, ssl_verify_fun broken and need to be updated.

Several surprising differences so far was formatting.

  • mix format default line_length constraint becoming exactly 98 as docs said (previously it was 100 somehow), so running mix format --check-formatted on existing code will be failed until we reformat (if we accidentally have lines with 100 chars length).
  • typespec for anonymous function replaced with empty string by formatter, ie
    @spec proces_fn((() -> term()), keyword()) :: term()
    
    will be replaced to
     @spec proces_fn(( -> term()), keyword()) :: term()
    
    Dialyzer works as expected, just feel a bit strange for me at first.
  • charlist written inside ' replaced with sigil ~c"" i.e 'word' become ~c"word"

I’ve checked the changelog, they’re already documented. So. no issues so far.

3 Likes

Thanks for the update!

I have noticed a small but annoying “but”:

➜ does anyone else find the new behavior of reporting multiple errors per file a bit tedious?

I find myself scrolling around a lot now,
in need to find the actual error embedded within the other warnings - as the last message is not always the actual error anymore.

It breaks my workflow so heavily (code reloading in Phoenix and seeing errors in the browser or doing recompile() in iex) that I reverted to 1.14 for now.

Is there maybe an option to re-enable the old behavior again?

You should be able to see errors in the Phoenix error page. Make sure you are on latest and, if it still does not work, please let me know.

The error shows but in a different spot than before. Let me explain in detail.

If there are yet unsolved warnings (which one want to take care of later)
it makes it hard to glance in an instance what the error is you just introduced in your code.

Also, in iex, this is different than before:

The screenshots I chose have the number of warnings fit the screen, but I might have more of them.
I even think I saw an error once in the middle of the list of warnings.

➜ for terminal & browser that leads to scrolling around where the error is, which takes time and involves mousing.

  • in iex: it would be ideal to have the warnings first, error(s) last.
  • in phoenix error pages: error(s) first, warnings after

it was like this till 1.14

I could also live with hiding warnings in iex and Phoenix at all, as I mostly need them for elixir-ls anyway - but that seems also wrong to me.

I hope I don’t come around as nitpicky, but these details are important for developer experience, and error handling in elixir is known to be good.

That’s a consequence of parallel compilation. We indeed may have warnings from other files overlapping. We will see how to improve it, we should at least hide the shutdown message, but the new behavior is somewhat expected.

But also, if that is motivation to fix warnings, even better. :slight_smile:

2 Likes