Erlang deps loading

时间:2015-05-09 14:56:24

标签: erlang project-structure

我正在尝试编写erlang第一个应用程序。它有 https://github.com/emedia-project/erlffmpeg在deps中,我几乎有 相同的Makefile。

当我在erlffmpeg dir和eval README中运行erlang shell时 好的,一切都好。但是当我从我的项目的目录中做到这一点时,我得到了错误 喜欢:#!/usr/bin/env python # -*- coding: utf-8 -*- import signal import logging from functools import partial from multiprocessing import Process, Queue from threading import Thread from time import sleep logger = logging.getLogger("mepy-client") class SocketClientProtocol(object): def __init__(self, q_in, q_out, q_binary): self.q_in = q_in self.q_out = q_out self.q_binary = q_binary self.running = True t = Thread(target=self._loop) t.start() t = Thread(target=self._loop_binary) t.start() def _loop(self): print("start of loop 2") for res in iter(self.q_in.get, None): self._handle_msg(res) print("end of loop 2") def _loop_binary(self): print("start of loop 3") for res in iter(self.q_binary.get, None): self._handle_binary(res) print("end of loop 3") def _handle_msg(self, msg): msg_type = msg[0] if msg_type == "stop2": self.q_in.put(None) self.q_binary.put(None) def _put_msg(self, msg): self.q_out.put(msg) def stop(self): print("STOP RECEIVED") self.running = False self.q_in.put(None) self.q_binary.put(None) def _handle_binary(self, data): pass def handle_element(self): self._put_msg(["something"]) def run_twisted(q_in, q_out, q_binary): s = SocketClientProtocol(q_in, q_out, q_binary) signal.signal(signal.SIGINT, partial(signal_handler_child, s)) while s.running: sleep(2) s.handle_element() class MediatorSender(object): def __init__(self): self.q_in = None self.q_out = None self.q_binary = None self.p = None self.running = False def start(self): if self.running: return self.running = True self.q_in = Queue() self.q_out = Queue() self.q_binary = Queue() print("!!!!START") self.p = Process(target=run_twisted, args=(self.q_in, self.q_out, self.q_binary)) self.p.start() self.loop = Thread(target=self._loop) self.loop.start() def stop(self): print("!!!!STOP") if not self.running: return print("STOP2") self.running = False self.q_out.put(None) def _loop(self): print("start of loop 1") for res in iter(self.q_out.get, None): self._handle_msg(res) print("end of loop 1") def _handle_msg(self, msg): self._put_msg(msg) def _put_msg(self, msg): self.q_in.put(msg) def _put_binary(self, msg): self.q_binary.put(msg) def send_chunk(self, chunk): self._put_binary(chunk) def signal_handler_main(ms, *args): ms.stop() def signal_handler_child(s, *args): s.stop() if __name__ == "__main__": ms = MediatorSender() signal.signal(signal.SIGINT, partial(signal_handler_main, ms)) ms.start() for i in range(100): ms.send_chunk("some chunk of data") while ms.loop.is_alive(): ms.loop.join(9999999) print('done main') 。所以,我的erl shell从ffmpeg看到了fns 模块,但当我尝试评估这个fns时,似乎shell不知道 关于ffmpeg的继承权。

我使用ucp detect undef命令运行erl shell。简而言之,它make dev

似乎我错过了一些关于模块加载的知识。 我应该怎么做以及你建议我阅读什么?

谢谢!

1 个答案:

答案 0 :(得分:2)

所以,答案是使用rebar并设置代码如:

{deps, [
   {ffmpeg, ".*", {git, "https://github.com/emedia-project/erlffmpeg", "master"}}
]}.

在这种情况下,rebar将自动下载根deps文件夹中的所有iner依赖项,因此带有erl -pa ebin deps/*/ebin命令的shell将挂接所有.beam个文件。

非常感谢友好的#erlang成员。