【问题标题】:Can I use different versions of a package for different environments?我可以为不同的环境使用不同版本的包吗?
【发布时间】:2019-06-29 20:45:28
【问题描述】:

我有一个项目,我需要在本地环境中使用 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

【问题讨论】:

  • 好吧,我想对于我的特定问题,更好的解决方案是为应用程序的 SQLite 版本使用不同的分支。原来的问题仍然存在。
  • 除了显而易见的解决方案,即在您的本地环境中使用 Postgres 而没有适用于 Ecto 3 的 SQLite 适配器之外,如果您不想创建另一个,我认为保留两个不同的锁文件是最干净的解决方案分支。

标签: package elixir package-management hex-pm


【解决方案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 环境的 lockfile 和 deps 都不同。

【讨论】:

    猜你喜欢
    • 2021-01-29
    • 2023-01-31
    • 2021-08-15
    • 2020-02-08
    • 1970-01-01
    • 2020-11-01
    • 2020-06-05
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多