如何 运行 通过手动调用在生产中自定义任务?

How to run custom tasks in production by manually calling them?

我的Phoenix项目我是手动编译部署的,没有distillery之类的第三方库,基本上都是借助mix compile和mix release命令。

我需要一种在生产模式下在服务器上 运行 自定义命令或任务的方法。它类似于 运行ning 迁移。但我对它是如何完成的感到困惑。当命令或任务正在执行时,项目本身可能会或可能不会启动和 运行ning。我需要能够将一些参数传递给所述命令任务。

怎么做?

(1) 我知道

defmodule Mix.Tasks.MyTask1 做 .... 但我如何在生产环境中,在服务器上做呢?这甚至是在生产服务器上 运行 它们的正确推荐方法吗?

(2) 我知道 bin/my_app eval 'MyProject.MyTask1' 但如果有其他上述方法,为什么它存在?同样,这是在生产服务器上 运行 它们的正确且推荐的方法吗?

(3)还有其他方法吗?

我很困惑。在什么情况下使用哪一个?如何正确使用它们?

我知道有几种方法可以实现这一点,每种方法都有自己的 pros/cons。例如,定义自定义混合任务很简单,但在您的情况下,Mix 在构建+编译版本中不可用。

我通常采用的解决方案是支持有限数量的任务(例如迁移):这些是必须 运行 [=23] =] 在实时生产实例上。这比常规混合任务更结构化,但它的编写方式无需混合即可工作。请参阅 Phoenix docs for an example,但它归结为从常规模块而不是通过混合任务调用必要的函数。这假设您能够通过 iex 连接到您的应用程序的 运行ning 实例(例如,通过 SSH'ing 进入框和 运行ning ./bin/myapp remote 或类似的) .

这个问题可能不会产生高质量的答案,因为任何解决方案都有些主观。