【问题标题】:Reconsolidate protocols in Elixir 1.2 or higher在 Elixir 1.2 或更高版本中重新整合协议
【发布时间】:2016-04-30 01:39:04
【问题描述】:

我有一个宏,它创建一个模块、一个模块结构,并为该结构实现一个协议。

在我的套件中,我有一个简单的测试模块,它调用宏,然后对生成的模块/结构/协议实现进行断言。一项测试使用 struct 调用协议函数来断言它已被实现。在 1.2 之前,这可行,但现在失败了,运行套件时我收到以下警告。

test/dogma/rule_builder_test.exs:7: warning: the Dogma.Rule \
protocol has already been consolidated, an implementation for \
Dogma.RuleBuilderTest.MagicTestRule has no effect

我现在已经删除了这个测试,因为我相信我的套件的其余部分已经充分测试了这个功能,但我很好奇是否有办法让它再次工作,或者至少让警告静音。

我玩了Process.consilodate/2,但没有成功。

【问题讨论】:

    标签: metaprogramming elixir


    【解决方案1】:

    从 Elixir 1.2 开始,Mix 默认会合并协议,这可能会导致此处描述的问题:

    https://github.com/elixir-lang/elixir/blob/v1.2/CHANGELOG.md#workflow-improvements

    在我看来,您对同一个问题有不同的看法,但解决方法很可能是相同的。在项目配置中设置 consolidate_protocols: false (仅在测试环境中运行时)。

    【讨论】:

    • 啊,我不知道consolidate_protocols 混合项目选项。谢谢。
    • 澄清一下,混合项目选项是mix.exs 文件中project 函数中的选项。如果你看到这个,你可能想要def project, do: [consolidate_protocols: Mix.env != :test]
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多