问题

此前代码放在一个repo下, 代码重用的方式是umbrella. 为了将代码拆分, 让服务间的边界更明显, 我们将elixir project拆分开, 以deps方式重用代码. 遇到了deps编译时默认env为prod问题.

详情

发现部分单元测试失效, 后面定位到, 类似如下的代码, 全部失效.

  if Mix.env != :prod do
    xxxx
  end

解决

参考
https://stackoverflow.com/que...
修改mix.exs, 让构建deps时, 使用当前的Mix.env.

  def project do
    [
      ...
      deps: deps(Mix.env()),
    ]
  end

  defp deps(env) do
    [
      {:ejoy_amqp, git: "https://xxx.git", env: env},
      {:ejoy_utils, git: "https://xxx.git", env: env},
    ]
  end

原理

mix 是一个application

mix shell

~ » which mix                                                                                                                                                                               enjolras@ubuntu
/usr/local/bin/mix
------------------------------------------------------------
~ » cat /usr/local/bin/mix                                                                                                                                                                  enjolras@ubuntu
#!/usr/bin/env elixir
Mix.start
Mix.CLI.main

mix.ex

  use Application

  @doc false
  def start do
    {:ok, _} = Application.ensure_all_started(:mix)
    :ok
  end

可以看到mix是自举的, mix也有mix.exs file.
elixir_src/lib/mix/mix.exs

defmodule Mix.MixProject do
  use Mix.Project

  def project do
    [
      app: :mix,
      build_per_environment: false,
      version: System.version(),
      escript: [main_module: Mix.CLI]
    ]
  end

  def application do
    [
      registered: [Mix.State, Mix.TasksServer, Mix.ProjectStack],
      mod: {Mix, []},
      env: [colors: []]
    ]
  end
end

project.ex


enjolras1205
77 声望9 粉丝

引用和评论

0 条评论