如何在具有断点的应用上下文中运行本地安装的混合任务?

How can I run a locally installed mix task in the context of an app with a breakpoint?

提问人:Michael Johnston 提问时间:11/3/2023 最后编辑:Michael Johnston 更新时间:11/3/2023 访问量:32

问:

我想在我的应用程序的上下文中运行本地安装的混合任务(我的意思是从另一个项目安装的任务),但首先设置一个断点。mix archive.build; mix archive.install

如果我运行 ,那工作正常。当然,当我在会话中时,任务已经运行了。iex -S mix locally.installed.taskiex

如果我随后可以在设置断点后再次运行它,那就太好了,如下所示:

break! Mix.Tasks.Locally.Installed.Task.run/1 #=> 1
Mix.Task.run("locally.installed.task", args)  #=> :noop

但是,这只为我本地安装的任务返回,尽管它适用于应用程序中定义的任务或默认的全局任务,例如 .:noopmix deps

为什么返回“本地安装”任务?Mix.Task.run:noop

有没有办法在先设置断点的同时使用 IEX 运行混合任务?

编辑:混合制作任务是幂等的。即,如果我这样做,然后运行,我也会得到 iex -S mixMix.Task.run:noop':noopiex -S mix depsMix.Tasks.run("deps", []):noop, or if I run any given task in an session withit will only run once and subsequent invocations return

有一个有效的...Mix.Task.rerun/2

Elixir 断点 Elixir-IEX

评论


答:

2赞 Aleksei Matiushkin 11/3/2023 #1

正如文档中所说,应该使用 https://hexdocs.pm/mix/Mix.Task.html#reenable/1 显式重新启用任务。

rerun/1也会起作用。

评论

1赞 Michael Johnston 11/4/2023
reenable工程。我还发现,如果我启动时,已安装的混音项目中的所有代码都会加载,我可以在该任务或库中的任何位置设置断点,然后调用iexiex -S mix help locally.installed.taskMix.Task.run...