Могу ли я использовать разные версии пакета для разных сред?

У меня есть проект, где мне нужно использовать SQLite в локальной среде, но Postgres на обычном сервере.

К сожалению, пока нет адаптера SQLite для Ecto 3, что заставляет меня держать Ecto и некоторые связанные пакеты на 2.x, которая вызвала некоторые проблемы, такие как эта: Ecto 2.0 SQL Sandbox Error на тестах

Интересно, можно ли было бы указать две разные версии Ecto и, следовательно, зависимости для среды :local а также :prod, В настоящее время это кажется невозможным, поскольку в каждом проекте используется только один файл блокировки. Кажется, единственный способ достичь этого - хранить два разных файла блокировки в каталоге проекта? например, https://elixirforum.com/t/only-fetch-deps-compatible-for-a-specific-version-of-elixir/16213

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

И файл блокировки, и deps различны для :local среда.

Другие вопросы по тегам