如何在IEx中先设断点运行本地安装的Mix任务?为何返回:noop?
问题解答:在IEx中调试本地安装的Mix任务
为什么Mix.Task.run返回:noop?
Mix的任务运行机制自带幂等性保护:同一个IEx会话内,任何任务通过Mix.Task.run/2只能执行一次,后续重复调用都会返回:noop。这不是本地安装归档任务的特例——比如你用iex -S mix deps启动后,再调用Mix.Task.run("deps", [])也会得到同样的结果。
你用iex -S mix locally.installed.task启动会话时,目标任务已经在IEx初始化阶段执行完毕,所以后续调用Mix.Task.run触发了幂等性保护,返回:noop。
如何在IEx中先设断点再运行任务?
有两种可靠的解决方式:
方式1:启动时不预先执行任务
直接用iex -S mix进入IEx会话,此时目标任务还未执行:
# 设置断点 break! Mix.Tasks.Locally.Installed.Task.run/1 # 首次执行任务,断点会触发 Mix.Task.run("locally.installed.task", args)
方式2:绕过幂等性检查重新执行任务
如果已经通过iex -S mix [task]预先执行过任务,使用Mix.Task.rerun/2代替Mix.Task.run/2,它会强制重新运行任务:
# 设置断点 break! Mix.Tasks.Locally.Installed.Task.run/1 # 强制重新执行任务,断点会触发 Mix.Task.rerun("locally.installed.task", args)
内容的提问来源于stack exchange,提问作者Michael Johnston
相关产品推荐
相关产品推荐

