Мне нужно автоматизировать установку множества модулей Perl. Большинство из них присутствует в портах. Но некоторые модули находятся в связках, например www/p5-HTML-Tree
Prvides HTML::Element
, HTML::TreeBuilder
, и т.д.
В идеале это должна быть утилита командной строки с синтаксисом, например:
install_from_ports CGI CGI::FormBuilder HTML::TreeBuilder ...
Есть ли у вас какие-либо предложения?
Вот слегка проверенное решение:
#!/bin/sh
# Build a regex to match all the .pm files
_regex=""
for arg in $*; do
arg=`echo ${arg} | sed -e 's|::|/|g'`
if [ "X${regex}X" != "XX" ]; then
regex="${regex}|"
fi
regex="${regex}(${arg})"
done
regex="%%SITE_PERL%%/(${regex}).pm"
# Find the .pm files and derive the port names from them, then install using portinstall.
find /usr/ports -type f -name pkg-plist -path '*/p5-*' -exec egrep -l $regex {} + | sort -u | sed -e 's|/usr/ports/||' -e 's|/pkg-plist||' | xargs portinstall
Теперь это не будет обнаруживать модули, установленные портами, у которых нет pkg-plist, но их очень мало. В моей системе только 58 из 4188 портов p5- * не имеют файлов pkg-plist.