Как составить список пакетов и зависимостей, которые будут установлены в 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, В качестве бонуса он может показывать неустановленные зависимости в виде дерева.

Другие вопросы по тегам