简体   繁体   中英

Can I use different versions of a package for different environments?

I have a project where I need to use SQLite in a local environment but Postgres on a normal server.

Unfortunately, there is no SQLite adapter for Ecto 3 yet, forcing me to keep the Ecto and some related packages at 2.x , which caused some problems such as this one: Ecto 2.0 SQL Sandbox Error on tests

I wonder if it would be possible to specify two different versions of Ecto and thus dependencies for the environments :local and :prod . Currently it seems impossible since there is only one lockfile per project. The only way to achieve it seems to be to store two different lockfiles in the project directory? eg https://elixirforum.com/t/only-fetch-deps-compatible-for-a-specific-version-of-elixir/16213

I haven't tried it in depth, but maybe changing the mix.exs file like this would help:

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

Both the lockfile and deps are different for the :local environment.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM