erlang 覆盖规范或忽略 rebar3 的中断合同错误
erlang override spec or ignore break contract error with rebar3
我 运行 rebar3 在一个项目中有几个第三方依赖项,其中一个有定义规范的问题。当我移动到 rebar3 时,弹出一个新错误,显示我的一个方法调用违反了合同:
riakc_pb_socket:get(my_app, Bucket::any(), Key::any(), Options::any(),
Timeout::any())
breaks the contract
(pid(), bucket() | bucket_and_type(), key(), get_options(), timeout())
-> {'ok',riakc_obj()} | {'error',term()} | 'unchanged'
实际上,此代码与原子或 pid 一起工作得很好。除了更新第三方库之外,是否有任何方法可以在不分叉代码的情况下覆盖该规范,或者忽略该特定错误?
可以使用 -dialyzer(...)
属性来抑制 Dialyzer 警告,如文档所述 here。
对于您的情况,使警告静音的适当属性可能类似于:
-dialyzer({no_contracts, function_that_calls_riakc_pb_socket_get}).
(注意:没有代码我无法实际测试。)
请记住,虽然您的 "flagged" 调用可能正常工作,但第 3 方库开发人员的意图可能是仅支持指定合同描述的参数(因此尊重他们可以让你在未来的版本中免于麻烦。
我 运行 rebar3 在一个项目中有几个第三方依赖项,其中一个有定义规范的问题。当我移动到 rebar3 时,弹出一个新错误,显示我的一个方法调用违反了合同:
riakc_pb_socket:get(my_app, Bucket::any(), Key::any(), Options::any(),
Timeout::any())
breaks the contract
(pid(), bucket() | bucket_and_type(), key(), get_options(), timeout())
-> {'ok',riakc_obj()} | {'error',term()} | 'unchanged'
实际上,此代码与原子或 pid 一起工作得很好。除了更新第三方库之外,是否有任何方法可以在不分叉代码的情况下覆盖该规范,或者忽略该特定错误?
可以使用 -dialyzer(...)
属性来抑制 Dialyzer 警告,如文档所述 here。
对于您的情况,使警告静音的适当属性可能类似于:
-dialyzer({no_contracts, function_that_calls_riakc_pb_socket_get}).
(注意:没有代码我无法实际测试。)
请记住,虽然您的 "flagged" 调用可能正常工作,但第 3 方库开发人员的意图可能是仅支持指定合同描述的参数(因此尊重他们可以让你在未来的版本中免于麻烦。