Xóa các phụ thuộc không cần thiết khỏi Cygwin


15

Trong Cygwin khi tôi cài đặt gói mới, nó sẽ tự động cài đặt mọi phụ thuộc cần thiết cho gói đó.

Sau này nếu tôi chọn loại bỏ gói đó, làm thế nào tôi có thể loại bỏ các phụ thuộc mà nó đã cài đặt với nó, không còn cần thiết nữa?

Câu trả lời:


8

Vâng, đây là giải pháp hiện tại của tôi, tôi đã đưa ra. Sử dụng kiến ​​thức hạn chế (rất) của tôi về bash và Google.

#!/bin/bash
# Print a list of packages that no other package depends on

PackageCount=0
PackageIter=0

# Populate package array
declare -A Packages
PackageList=$(cygcheck.exe -c | cut -d' ' -f1 | tail -n +3)
for P in $PackageList; do
    Packages[${P,,}]=0
    ((PackageCount++))
done

# Determine the last mirror used
LastMirror=$(sed -n '/last-mirror/{n;p}' /etc/setup/setup.rc | tr -d '\t')
echo "[DEBUG] LastMirror = $LastMirror"

# Download the setup.ini file from the mirror server
echo "[DEBUG] Downloading setup.ini from mirror"
if which bzcat &>/dev/null; then
    wget --quiet "${LastMirror}$(uname -m)/setup.bz2" -O - | bzcat > setup.ini
else
    wget --quiet "${LastMirror}$(uname -m)/setup.ini" -O setup.ini
fi

for P in $PackageList; do
    ((PackageIter++))
    echo -ne "[DEBUG] Processing packages $((PackageIter * 100 / PackageCount))%\r"

    deps=$(sed -n "/^@ $P$/,/^requires/p" setup.ini | grep -i '^requires' | cut -d' ' -f2-)

    for dep in $deps; do
        if [[ ${Packages[${dep,,}]} ]]; then
            Packages[${dep,,}]=$((Packages[${dep,,}]+1))
        fi
    done
done

echo -e "\n== Packages =="

for P in $PackageList; do
    if [[ ${Packages[${P,,}]} == 0 ]]; then
        echo $P
    fi
done

rm setup.ini

Tôi muốn xem liệu có ai có giải pháp tốt hơn hay bất kỳ mẹo nào để cải thiện kịch bản của tôi không.


Tôi không biết nếu bạn vẫn ở trên trang web, nhưng tôi đã chỉnh sửa tập lệnh của bạn để sửa N=$N+1lỗi - trong bash, điều này thực sự sẽ tạo ra một chuỗi chứ không phải là toán học. Xung quanh câu lệnh (( ))cho phép bạn thực hiện phép toán thực sự trong bash (như bạn phải phát hiện ra sau này trong tập lệnh). Ngoài ra, tôi đã không thay đổi phần này, nhưng bạn không cần phải đếm số lượng phần tử trong một mảng. Thay vì $PackageCount, bạn có thể truy cập ${#PackageList}để lấy số lượng phần tử trực tiếp.
piojo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.