Hound does not work in mix task from normal console

The problem

In our scraping project we need to use hound (for only one scraper) and we want to run all scrapers in it at same time (by flow dependency). Only one scraper (that works in console) fails when running scraper. I created a smallest example to reproduce my problem.

Environment

Elixir and Erlang versions (both installed by asdf):

elixir -v
Erlang/OTP 19 [erts-8.3.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Elixir 1.4.2

Deps tree:

mix deps.tree
example
└── hound ~> 1.0 (Hex package)
    β”œβ”€β”€ hackney ~> 1.5 (Hex package)
    β”‚   β”œβ”€β”€ certifi 1.2.1 (Hex package)
    β”‚   β”œβ”€β”€ idna 5.0.2 (Hex package)
    β”‚   β”‚   └── unicode_util_compat 0.2.0 (Hex package)
    β”‚   β”œβ”€β”€ metrics 1.0.1 (Hex package)
    β”‚   β”œβ”€β”€ mimerl 1.0.2 (Hex package)
    β”‚   └── ssl_verify_fun 1.1.1 (Hex package)
    └── poison >= 1.4.0 (Hex package)

Steps to reproduce:

1 create new project like: mix new example
2 add hound to dependencies and run mix deps.get
3 add to configuration: config :hound, driver: "phantomjs" (this is current configuration in our real project)
4 add mix task like:

defmodule Mix.Tasks.Example do
  use Mix.Task

  def run(_args) do
    Hound.start_session
    Hound.end_session
  end
end

5 run phantomjs with --wd argument
6 run example task like: mix example

Current behavior:

  1. Running elixir console for current project iex -S mix and running scraper Mix.Tasks.Example.run([]) works and returns :ok atom
  2. Running task like mix example raise:
** (ArgumentError) argument error
    (stdlib) :ets.lookup(Hound.SessionServer, #PID<0.71.0>)
    lib/hound/session_server.ex:19: Hound.SessionServer.current_session_id/1
    lib/hound/session_server.ex:13: Hound.SessionServer.session_for_pid/2
    lib/mix/tasks/example.ex:5: Mix.Tasks.Example.run/1
    (mix) lib/mix/task.ex:294: Mix.Task.run_task/3
    (mix) lib/mix/cli.ex:58: Mix.CLI.run_task/2

Expected behavior:

In both cases (running task from iex and running task from normal console) should work and return :ok atom.

Am I forgot about something or it’s a bug in hound?

Your application is not started for tasks, if you need it started you have to do it yourself. iex -S mix does start your application, that’s why it works from there.

2 Likes

@NobbZ: Thank you :slight_smile:

It is always darkest before the dawn.

1 Like