我可以在不同的环境中使用不同版本的软件包吗?

时间:2019-02-05 23:13:23

标签: package elixir package-management hex-pm

我有一个项目,需要在本地环境中使用SQLite,但需要在普通服务器上使用Postgres。

不幸的是,目前还没有适用于Ecto 3的SQLite适配器,这迫使我将Ecto和一些相关软件包保留在2.x上,这引起了诸如以下问题:Ecto 2.0 SQL Sandbox Error on tests

我想知道是否可以指定两种不同版本的Ecto,从而指定环境:local:prod的依赖性。当前似乎是不可能的,因为每个项目只有一个锁文件。实现它的唯一方法似乎是在项目目录中存储两个不同的锁文件?例如https://elixirforum.com/t/only-fetch-deps-compatible-for-a-specific-version-of-elixir/16213

1 个答案:

答案 0 :(得分:1)

我还没有尝试过,但是也许像这样改变mix.exs文件会有所帮助:

defmodule YourProject.MixProject do
  use Mix.Project

  def project do
    [
      app: :your_project,
      version: "0.1.0",
      elixir: "~> 1.7",
      start_permanent: Mix.env() == :prod,
      deps: deps(Mix.env()),
      lockfile: lockfile(Mix.env())
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp lockfile(:local), do: "mix-local.lock"
  defp lockfile(_), do: "mix.lock"

  # Run "mix help deps" to learn about dependencies.
  defp deps(:local) do
     [{:ecto, "~> 2.0"}]
  end

  defp deps(_) do
     [{:ecto, "~> 3.0"}]
  end
end

:local环境中,锁文件和deps都不同。