我有一个Travis CI osx
构建,其brew
依赖关系必须从源代码构建。
我知道Travis具有cache
功能,但是它没有有关如何缓存brew
构建或输出的任何文档。
关于如何在travis中缓存brew
包的任何想法?
最佳答案
这里存在3个独立的,松散相关的问题:
您不一定需要全部三个,所以请遵循适合您需要的任何部分。
缓存下载的瓶子
$HOME/Library/Caches/Homebrew
添加到Travis的缓存中(实际上,应该使用brew --cache
检索此路径,但是您不能在这里调用它)cache:
directories:
- $HOME/Library/Caches/Homebrew
brew cleanup
阶段运行before_cache
-否则,随着新软件包版本的发布,缓存将无限期增长before_cache:
- brew cleanup
缓存本地制造的瓶子
full code太长,无法在此处列出,因此提供了算法。
这是上一节的补充。 如果不使用它,则在安装步骤中将本地瓶保存在Homebrew缓存之外的某个位置,并在下面的启动步骤中以适当的名称将其添加到缓存中。
brew deps
递归检查软件包的依赖关系(bottled)
输出中没有brew info <pkg>
),请在--include-build
brew list --versions <pkg>
成功)和最新版本(brew outdated
缺少),请跳过它brew unlink
旧版本(如果不是旧版本的话)([keg-only]
输出中没有brew info
)brew install
调用所有--force
brew install
将其编码为brew install --build-bottle <pkg>
brew bottle --json <pkg>
brew uninstall --ignore-dependencies <pkg>
brew install <bottle>
(似乎没有任何官方方法来获取生成的瓶子和JSON文件的名称。我从
brew bottle
输出中获取了瓶子的名称,并从中推断出JSON文件名。)brew bottle --merge --write <json file>
brew --cache <pkg>
给出的适当名称将瓶子文件保存到Travis缓存中$HOME/Library/Caches/Homebrew
形式链接到下载的文件。您不需要这样做。)brew update
brew info --json=v1 <pkg>
和brew info --json=v1 <bottle>
的输出)。brew --cache
获取到瓶子的路径,因此需要独立保存它。在撰写本文时,符号链接(symbolic link)尚未保存在Travis的缓存中,因此我最终使用了包含路径的常规文件。 brew --cache <pkg>
是否仍指向您的瓶子。 before_cache
上:brew cleanup
,请在运行它之前将其本地构建的瓶子文件保存在缓存中的某个位置,因为cleanup
可能会删除这次不需要的文件。在cleanup
之后,恢复已删除的那些。 缓存自制软件元数据
(同样,full code太长,因此请给出算法。)
如果您运行
brew update --verbose
(并确保.travis.yml
中没有 secret 变量或您的Travis项目设置-仅当brew
是tty时stdout
才会打印许多状态消息)-您会看到真正构成Homebrew自更新操作的内容-因此您应该缓存的内容:rebase
)拉入实际上是git
存储库的一些路径中:/usr/local/Homebrew
-自制本身/usr/local/Homebrew/Library/Taps/*/*
-已安装的水龙头Taps/caskroom/homebrew-cask
迁移到Taps/homebrew/homebrew-cask
,并在Taps/homebrew/homebrew-cask/homebrew-cask
上创建一个副本。如果被缓存,则该副本将在下次运行时导致“错误:文件存在”。 Taps/homebrew/homebrew-versions
因此,操作将是:
/usr/local/Homebrew
添加到Travis缓存postinstall
脚本可能会影响系统的其他任意部分,因此应该每次从(缓存的)瓶子安装新的软件包版本,而不是缓存结果。无论如何,安装瓶子只需要几秒钟。 brew update
之前:清理Homebrew代码库Taps/caskroom/homebrew-cask
,则删除Taps/homebrew/homebrew-cask
目录git
下找到所有/usr/local/Homebrew
仓库(find -type d -name .git
,获取结果的dirname
),然后在每个目录中运行git clean -fxd
来摆脱Travis的剩菜brew cleanup
清理剩余的Homebrew缓存(如果与上一节结合使用,请参见此处进行其他操作)-否则,“迁移缓存条目...”中的brew update
会出现很多错误。 ”阶段。 brew update
上:brew update --merge
-它将使用瓶子信息git commit
结果。没有通用的方法,因此您必须使用脚本来解析和编辑公式文件,并从bottle do
表中删除相应的行。使用brew formula <pkg>
检索公式文件的路径。 brew tap | grep -qxF <tap> || brew tap <tap>
brew tap --list-pinned | grep -qxF <tap> || brew tap-pin <tap>
before_cache
上:Taps/homebrew/homebrew-cask/homebrew-cask
(如果存在)关于macos - Cache Brew使用travis ci构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39930171/