MacPorts和HomeBrew:我可以从文件或列表中安装多个软件包吗?

时间:2014-09-09 18:27:35

标签: homebrew macports

感到惊讶我无法找到有关此内容的更多信息。我正在尝试创建我已安装的所有端口和配方的列表/文件,并在另一台Macbook上重新填充它们。这可能没有太大的麻烦吗?

即。 python pip具有一个功能,您可以从需求文件中安装,该文件列出了所需的所有软件包及其版本。 pip install -r requirementsfile

3 个答案:

答案 0 :(得分:3)

对于MacPorts,您可以使用port installed requested获取手动安装的端口列表。再次安装这些的一种方法是在bash中编写一个循环;不过,这可能会变得棘手。

看看https://trac.macports.org/wiki/Migration基本上具有相同要求的{{3}},即使没有覆盖移动框(您可以找出切换框的位置)。如果你想避免手工操作,可以在底部找到一个脚本。

答案 1 :(得分:1)

您可以将brewfile与Homebrew一起使用。

答案 2 :(得分:0)

portMacPorts程序可以读取MacPorts命令的文件,例如:

> cat cmdfile.txt
install git
install vim

> sudo port -F cmdfile.txt
--->  Computing dependencies for git
...
--->  Computing dependencies for vim
...
...

选项 -F 传递一个“命令文件”:

> port -h
Usage: port
        [-bcdfknNopqRstuvy] [-D portdir|portname] [-F cmdfile] action [actionflags]
        [[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]...

"port help" or "man 1 port" for more information.

运行portf

事实证明,MacPorts 还安装了 portf,它是指向 port 的符号链接:

> ls -l /opt/local/bin/portf
lr-xr-xr-x  1 root  admin  4 Jun 29 13:25 /opt/local/bin/portf -> port

并且相当于运行port -F

> sudo portf cmdfile.txt
--->  Computing dependencies for git
...
--->  Computing dependencies for vim
...

为每个 install 命令指定多个包名称

请注意,port install 接受多个包名称。指定多个包名称可以加快执行速度,因为在 每个 install 命令完成后会扫描二进制文件以查找链接错误(并且消耗的时间不可忽略)。例如:

> cat cmdfile.txt
install git vim

> sudo port -F cmdfile.txt
--->  Computing dependencies for git
...
--->  Computing dependencies for vim
...
--->  Scanning binaries for linking errors
...

安装需求文件中列出的包

为文件中的包列表运行 port install 的快速方法是:

> cat macports_packages.txt
git
vim

> python -c '\
> with open("macports_packages.txt", "rt") as f:
>     text = f.read()
> print("install " + text.replace("\n", " "))' | sudo port
MacPorts 2.7.1
Entering shell mode... ("help" for help, "quit" to quit)
--->  Computing dependencies for git
...
--->  Computing dependencies for vim
...
--->  Scanning binaries for linking errors
...

来自 MacPorts 源代码的详细信息

更新日志

引用 MacPorts 更新日志:

https://github.com/macports/macports-base/blob/9896034b1cf452ee905d61e9fcdee739d4112926/ChangeLog#L2487

<块引用>

版本 1.3(2006 年 7 月 27 日):

https://github.com/macports/macports-base/blob/9896034b1cf452ee905d61e9fcdee739d4112926/ChangeLog#L2584-L2586

<块引用>
  • 添加新的选项 -F,指定一个命令文件 读取并处理。可以提供多个此类选项以提供 多个命令文件。如果文件名是“-”,则读取标准输入。

https://github.com/macports/macports-base/blob/9896034b1cf452ee905d61e9fcdee739d4112926/ChangeLog#L2591-L2594

<块引用>
  • 如果 port 被调用为 portf,则 -F 被假定为隐式的第一个 参数(所以真正的第一个参数被当作一个命令文件 处理)。这应该允许使用 shebang 行,例如: !/usr/bin/env 端口

代码

最相关的 Tcl code 是:

https://github.com/macports/macports-base/blob/9896034b1cf452ee905d61e9fcdee739d4112926/src/port/port.tcl#L4628-L4633

                    F {
                        # Name a command file to process
                        advance
                        if {[moreargs]} {
                            lappend ui_options(ports_commandfiles) [lookahead]
                        }

https://github.com/macports/macports-base/blob/9896034b1cf452ee905d61e9fcdee739d4112926/src/port/port.tcl#L5724-L5730

# If we've been invoked as portf, then the first argument is assumed
# to be the name of a command file (i.e., there is an implicit -F
# before any arguments).
if {[moreargs] && $cmdname eq "portf"} {
    lappend ui_options(ports_commandfiles) [lookahead]
    advance
}

https://github.com/macports/macports-base/blob/9896034b1cf452ee905d61e9fcdee739d4112926/src/port/port.tcl#L5835

        set exit_status [process_command_files $ui_options(ports_commandfiles)]

https://github.com/macports/macports-base/blob/9896034b1cf452ee905d61e9fcdee739d4112926/src/port/port.tcl#L4967-L4994

proc process_command_files { filelist } {
    set exit_status 0

    # For each file in the command list, process commands
    # in the file
    foreach file $filelist {
        if {$file eq "-"} {
            set in stdin
        } else {
            if {[catch {set in [open $file]} result]} {
                fatal "Failed to open command file; $result"
            }
        }

        set exit_status [process_command_file $in]

        if {$in ne "stdin"} {
            close $in
        }

        # Exit on first failure unless -p was given
        if {$exit_status != 0 && ![macports::ui_isset ports_processall]} {
            return $exit_status
        }
    }

    return $exit_status
}

正在搜索

repository macports-base 中的此信息是使用 ag 定位的,如下所示:

git clone git@github.com:macports/macports-base.git
cd macports-base
ag -u 'command file'