【问题标题】:Conditional compilation for a module inside lib/对 lib/ 中的模块进行条件编译
【发布时间】:2018-11-30 11:43:42
【问题描述】:

是否可以为特定环境排除/添加存在于 lib/ 文件夹中的模块?

defp elixirc_paths(:prod), do: ["lib", "lib/only-prod-module]
defp elixirc_paths(_),     do: ["lib"]

看起来也被添加到其他环境中,因为它存在于 lib 中,是否可以以某种方式排除它而无需将其添加到 lib 模块之外?

【问题讨论】:

  • 这样的用例是什么?您可以将模块定义包装在 if Mix.env() == :prod do ... end 中,它只会为 :prod 环境编译。但根据我的经验,这实际上并不是您想要的解决方案。
  • 只是好奇你是否可以排除路径或在 elixirc_path 上添加某种正则表达式,现在并没有真正将这种方法用于任何用例,例如我可以只使用 defp elixirc_paths(:prod), do: ["lib", "prod/only-prod-module] 但这意味着定义不同的路径
  • @JustinWood 但这看起来不可维护,是吗?为给定环境指向和编译整个文件或文件夹似乎更容易。
  • @Sebastialonso 我在评论中说这通常不是您想要做的。我询问了用例,以便我可以尝试提出更好的解决方案。基本上,我认为这是XY Problem 的一个例子。
  • @JustinWood 我正在考虑的一个用例是一些“配置管理”代码,例如为我的项目创建和管理 VPS 实例(在几个“生产”环境中)。我不需要或不希望在实际的:prod 环境应用程序代码中使用该代码,并且将通过MIX_ENV=ops iex -S mix 专门在iex 中运行该代码。

标签: elixir elixir-mix


【解决方案1】:

通常,您应该更喜欢使用配置来解决您的差异 项目的环境。

但一类(可能)合理的用例是(相对)ad-hoc Elixir 您项目的“脚本代码”。我正在考虑做类似 对用 Elixir 编写的项目的一些(模糊)“配置管理”代码的问题 并使用其他应用程序代码和配置。该代码将通过iex 使用 特殊的Mix 环境,例如MIX_ENV=ops iex -S mix.

我假设您在项目的mix.exs 中像这样使用elixirc_paths/1

defmodule SomeProject.Mixfile do

  use Mix.Project


  def project do
    [
      app:             :some_project,
      version:         "1.0.0",
      elixir:          "~> 1.12.3",
      elixirc_paths:   elixirc_paths(Mix.env),
      ...

:elixirc_paths 选项由内置的Mix 任务使用 mix compile.elixir。 【这个任务是 由mix compile 调用,除非您没有为您的项目编译 Elixir 代码。]

来自该任务的文档 [强调我的]:

配置

  • :elixirc_paths - 目录 查找源文件。默认为["lib"]

鉴于此,如果您必须(出于某种原因)将模块文件存储在 lib/ 下,您需要什么 贾斯汀伍德建议在 their comment 并在模块文件中做这样的事情:

if Mix.env() == :prod do
  defmodule SomeProject.SomeModule do
    ...
  end
end

另一种选择是将模块文件移动到项目的另一个顶级子目录, 例如lib_prod_only/,并修改你的elixirc_paths/1函数:

defp elixirc_paths(:prod), do: ["lib", "lib_prod_only"]
defp elixirc_paths(_),     do: ["lib"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-08
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多