如何在Elixir Mix的deps.get任务执行后自动运行自定义任务?
在Elixir Mix内置任务完成后自动执行自定义任务
当然可以实现!不用依赖Make工具,Mix本身就提供了几种优雅的方式来实现内置任务完成后自动执行自定义任务,我给你梳理两种常用方案:
方案一:使用Mix.Task.after/2注册任务钩子
Mix提供了Mix.Task.after/2函数,专门用来注册“任务完成后触发”的回调逻辑。你可以创建一个自定义任务来注册这个钩子,再通过别名让它和deps.get绑定。
首先创建一个负责注册钩子的任务:
defmodule Mix.Tasks.Deps.Hook do use Mix.Task @shortdoc "注册deps.get完成后的回调" def run(_args) do # 注册当deps.get任务完成后,自动执行other.get Mix.Task.after("deps.get", fn -> IO.puts("deps.get已完成,开始执行other.get...") Mix.Task.run("other.get") end) end end
然后在你的mix.exs文件里,把deps.get的别名设置为先执行钩子任务,再执行原任务:
defmodule YourApp.MixProject do use Mix.Project # ... 其他配置 ... defp aliases do [ "deps.get": ["deps.hook", "deps.get"] ] end end
这样当你运行mix deps.get时,会先注册好回调,等原deps.get任务执行完毕,就会自动触发other.get任务。这种方式的好处是不会修改原任务的逻辑,兼容性更强。
方案二:直接覆盖内置任务
如果你想要更直接的方式,可以直接重新定义Mix.Tasks.Deps.Get任务,在里面先调用原任务的逻辑,再执行你的自定义任务:
defmodule Mix.Tasks.Deps.Get do use Mix.Task @shortdoc "获取依赖并自动执行后续任务" def run(args) do # 获取原始的deps.get任务模块 original_task = Mix.Task.get("deps.get") # 执行原始任务逻辑 original_task.run(args) # 执行自定义任务 Mix.Task.run("other.get") end end
这种方式不需要配置别名,直接运行mix deps.get就会触发后续任务。但要注意:如果有其他依赖库也修改了这个内置任务,可能会出现冲突,所以这种方式更适合个人项目或者没有复杂依赖的场景。
补充:你提到的Make包裹方案
你说的用Make来包裹命令(比如make deps执行mix deps.get && mix other.get)也是完全可行的,适合需要跨语言或者和其他工具链整合的场景,但如果是纯Elixir项目,上面的Mix原生方案会更贴合生态。
内容的提问来源于stack exchange,提问作者Nate-Wilkins
相关产品推荐
相关产品推荐

