我可以为不同的环境使用不同版本的包吗?
Can I use different versions of a package for different environments?
我有一个项目,我需要在本地环境中使用 SQLite,但在普通服务器上使用 Postgres。
不幸的是,还没有 Ecto 3 的 SQLite 适配器,迫使我将 Ecto 和一些相关的包保留在 2.x
,这导致了一些问题,例如这个:
我想知道是否可以指定两个不同版本的 Ecto,从而指定环境 :local
和 :prod
的依赖项。目前这似乎是不可能的,因为每个项目只有一个锁定文件。实现它的唯一方法似乎是在项目目录中存储两个不同的锁文件?例如https://elixirforum.com/t/only-fetch-deps-compatible-for-a-specific-version-of-elixir/16213
我没有深入尝试过,但也许像这样更改 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 都不同。
我有一个项目,我需要在本地环境中使用 SQLite,但在普通服务器上使用 Postgres。
不幸的是,还没有 Ecto 3 的 SQLite 适配器,迫使我将 Ecto 和一些相关的包保留在 2.x
,这导致了一些问题,例如这个:
我想知道是否可以指定两个不同版本的 Ecto,从而指定环境 :local
和 :prod
的依赖项。目前这似乎是不可能的,因为每个项目只有一个锁定文件。实现它的唯一方法似乎是在项目目录中存储两个不同的锁文件?例如https://elixirforum.com/t/only-fetch-deps-compatible-for-a-specific-version-of-elixir/16213
我没有深入尝试过,但也许像这样更改 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 都不同。