Phoenix应用程序中的自定义混合任务

时间:2017-04-26 20:29:48

标签: elixir phoenix-framework

当我在我的凤凰应用程序中运行自定义混合任务(我认为它甚至不与凤凰相关但仍然)使用一些外部库(例如https://github.com/knrz/geocoder)我得到了

** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started
    :erlang.send(:geocoder_workers, {:"$gen_cast", {:cancel_waiting, #Reference<0.0.1.13074>}}, [:noconnect])

直到我添加

Application.ensure_all_started(:geocoder)

到Mix任务。所以我的问题是为什么我的所有依赖项都不会自动启动?是我做错了什么?

2 个答案:

答案 0 :(得分:8)

您是对的,默认情况下,在Mix任务中不会启动应用程序的依赖项。它们需要手动启动。启动所有应用程序依赖项的最简单方法是调用Mix.Task.run("app.start")(如果Mix不可用,则调用Application.ensure_all_started(:my_app))。这样,mix.exs文件中列出的所有应用程序如果尚未运行,将会启动。

这是在Phoenix Framework网站Mix Tasks页面末尾附近记录的:

  

如果您想让新的混音任务使用您的应用程序   基础架构,您需要确保应用程序何时启动   混合任务正在执行中。如果需要,这特别有用   从混合任务中访问您的数据库。谢天谢地,mix make   对我们来说真的很容易:

def run(_args) do
  Mix.Task.run "app.start"
  Mix.shell.info "Now I have access to Repo and other goodies!"
  ...
end

答案 1 :(得分:1)

在Elixir 1.11中,您可以使用docs for Mix.Task中所述的import pygame from pygame.locals import * from random import randint width = 500 height = 200 RED = (255, 0, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) MAGENTA = (255, 0, 255) CYAN = (0, 255, 255) BLACK = (0, 0, 0) GRAY = (150, 150, 150) WHITE = (255, 255, 255) dir = {K_LEFT: (-5, 0), K_RIGHT: (5, 0), K_UP: (0, -5), K_DOWN: (0, 5)} pygame.init() screen = pygame.display.set_mode((width, height)) font = pygame.font.Font(None, 24) running = True 模块属性:

@requirements

这等效于在@requirements ["app.start"] 函数中调用Mix.Task.run "app.start"