Как составить список пакетов и зависимостей, которые будут установлены в Macports?
Есть ли способ просто перечислить все новые пакеты и их зависимости, которые port
установит для данной команды?
Например, рассмотрите возможность установки стека SciPy с помощью следующего:
sudo port install py27-numpy py27-scipy py27-matplotlib py27-ipython +notebook py27-pandas py27-sympy py27-nose
Это устанавливает тонну пакетов и зависимостей, не перечисленных в приведенной выше команде.
Также некоторые из них у меня уже есть.
Я уже осведомлен о -y
переключатель, но это дает подробный вывод обо всем, включая пакеты, которые я уже установил.
Мне интересно иметь port
скажите, какие новые пакеты (будь то зависимости или нет) будут установлены.
Есть ли известный способ или люди просто разбирают -y
вывод команды, сравнивая каждый сообщенный пакет с существующими установленными пакетами?
ура
ps Я довольно новичок в Macports и MacOSX (в Linux apt-get всегда сообщает, какие новые пакеты будут установлены)
2 ответа
Вы можете использовать выражение порта для печати того, что будет установлено:
port echo rdepof:$yourport and not installed
или для нескольких портов
port echo \( rdepof:$yourport rdepof:$yourport2 ... \) and not installed
Из-за количества Portfiles, участвующих в этом, и того, как выполняются операции над множествами, это будет довольно медленно. При этом мы также работаем над улучшением этого и предоставлением обратной связи перед установкой, как apt-get в будущей версии MacPorts.
Neverpanic уже дал ответ, но, кажется, не в состоянии обработать варианты (например, +notebook
) и параметры командной строки (например, configure.compiler=macports-clang-3.7
). У меня было отдельное решение. Следующий скрипт Python может рекурсивно отображать новые зависимости:
#!/usr/bin/env python
#coding: utf-8
import re
import sys
import subprocess
# Gets command output as a list of lines
def popen_readlines(cmd):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
p.wait()
if p.returncode != 0:
raise subprocess.CalledProcessError(p.returncode, cmd)
else:
return map(lambda line: line.rstrip('\n'), p.stdout.readlines())
# Gets the port name from a line like " gcc6 @6.1.0_0 (active)"
def get_port_name(port_line):
return re.sub(r'^ (\S+).*', r'\1', port_line)
# Gets installed ports as a set
def get_installed():
installed_ports_lines = popen_readlines(['port', 'installed'])[1:]
installed_ports = set(map(get_port_name, installed_ports_lines))
return installed_ports
# Gets port names from items that may contain version specifications,
# variants, or options
def get_ports(ports_and_specs):
requested_ports = set()
for item in ports_and_specs:
if not (re.search(r'^[-+@]', item) or re.search(r'=', item)):
requested_ports.add(item)
return requested_ports
# Gets dependencies for the given port list (which may contain options
# etc.), as a list of tuples (combining with level), excluding items in
# ignored_ports
def get_deps(ports, ignored_ports, level):
if ports == []:
return []
deps_raw = popen_readlines(['port', 'deps'] + ports)
uninstalled_ports = []
for line in deps_raw:
if re.search(r'Dependencies:', line):
deps = re.sub(r'.*Dependencies:\s*', '', line).split(', ')
uninstalled_ports += [x for x in deps if x not in ignored_ports]
ignored_ports |= set(deps)
port_level_pairs = []
for port in uninstalled_ports:
port_level_pairs += [(port, level)]
port_level_pairs += get_deps([port], ignored_ports, level + 1)
return port_level_pairs
def main():
if sys.argv[1:]:
ports_and_specs = sys.argv[1:]
ignored_ports = get_installed() | get_ports(ports_and_specs)
uninstalled_ports = get_deps(ports_and_specs, ignored_ports, 0)
for (port, level) in uninstalled_ports:
print ' ' * (level * 2) + port
if __name__ == '__main__':
main()
Это может быть вызвано как port_rdeps.py libomp configure.compiler=macports-clang-3.7
, В качестве бонуса он может показывать неустановленные зависимости в виде дерева.