2009-04-03 20 views
10

mỗi sự Debian Policy Manual, kịch bản postinst của tôi là nhận được gọi là ở nâng cấp và cấu hình thời gian, khi "postinst configure cũ phiên bản", nơi cũ phiên bản là phiên bản cài đặt trước đó (có thể là null). Tôi muốn xác định phiên bản mới, tức là phiên bản hiện đang được định cấu hình (được nâng cấp lên).Làm cách nào để tải phiên bản mới được cài đặt trong một tập lệnh đăng Debian?

Biến môi trường $DPKG_MAINTSCRIPT_PACKAGE chứa tên gói; có vẻ như không phải là trường tương đương _VERSION. /var/lib/dpkg/status được cập nhật SAU KHI đăng bài chạy, vì vậy tôi dường như không thể phân tích cú pháp từ đó.

Bất kỳ ý tưởng nào?

Trả lời

1

Tại sao bạn không thể mã hóa cứng phiên bản vào tập lệnh postinst tại thời điểm đóng gói?

+0

+1: Nghe có vẻ hợp lý với tôi. – Powerlord

+5

Mã hóa nội dung này trong tập lệnh cần phải thay đổi nó mỗi lần ... Không phải là ý tưởng hay theo ý kiến ​​của tôi. –

3

tôi sử dụng lệnh hơi bẩn sau trong script postinst:

NewVersion=$(zcat /usr/share/doc/$DPKG_MAINTSCRIPT_PACKAGE/changelog.gz | \ 
    head -1 | perl -ne '$_=~ /.*\((.*)\).*/; print $1;') 
+0

xấu xí, nhưng nó hoạt động cho tôi. Họ chắc chắn không làm cho nó dễ dàng để làm một cái gì đó mà nên được đơn giản, làm họ! –

+0

Điều này chỉ hoạt động nếu thay đổi thực sự được nén:/ – Flimzy

+0

Điều này cũng không thành công đối với các phiên bản ~ không được phản ánh trong danh sách thay đổi. – Flimzy

5

Đây là phương pháp tốt nhất mà tôi đã tìm thấy để giải quyết vấn đề này là sử dụng một biến địa giữ trong .postinst (hoặc kiểm soát khác của bạn files):

case "$1" in 
    configure) 
     new_version="__NEW_VERSION__" 
     # Do something interesting interesting with $new_version... 
     ;; 
    abort-upgrade|abort-remove|abort-deconfigure) 
     # Do nothing 
     ;; 
    *) 
     echo "Unrecognized postinst argument '$1'" 
     ;; 
esac 

Sau đó, trong debian/rules, thay thế các biến giữ chỗ với số phiên bản thích hợp ở thời gian xây dựng:

# Must not depend on anything. This is to be called by 
# binary-arch/binary-indep in another 'make' thread. 
binary-common: 
    dh_testdir 
    dh_testroot 
    dh_lintian 
    < ... snip ... > 

    # Replace __NEW_VERSION__ with the actual new version in any control files 
    for pkg in $$(dh_listpackages -i); do \ 
     sed -i -e 's/__NEW_VERSION__/$(shell $(SHELL) debian/gen_deb_version)/' debian/$$pkg/DEBIAN/*; \ 
    done 

    # Note dh_builddeb *must* come after the above code 
    dh_builddeb 

Các kết quả .postinst đoạn, được tìm thấy trong debian/<package-name>/DEBIAN/postinst, sẽ trông giống như:

case "$1" in 
    configure) 
     new_version="1.2.3" 
     # Do something interesting interesting with $new_version... 
     ;; 
    abort-upgrade|abort-remove|abort-deconfigure) 
     # Do nothing 
     ;; 
    *) 
     echo "Unrecognized postinst argument '$1'" 
     ;; 
esac 
+0

Đối với gói phân đoạn Python, tôi cần thêm phiên bản vào bản đăng bài. Tôi đã thêm một hook vào setup.py để tìm kiếm và thay thế thông qua tệp postinst trong giai đoạn xây dựng. –

2
VERSION=$(zless /usr/share/doc/$DPKG_MAINTSCRIPT_PACKAGE/changelog* \ 
    | dpkg-parsechangelog -l- -SVersion') 

Ưu điểm so với các giải pháp khác ở đây:

  • Làm việc bất kể changelog được nén hay không
  • Sử dụng trình phân tích cú pháp thay đổi của dpkg thay vì cụm từ thông dụng, awk, v.v.
+0

Đẹp, nhưng điều đó đòi hỏi sự phụ thuộc vào 'dpkg-dev' trong gói của bạn.(và bạn có một '} '' quá nhiều trong ví dụ của bạn tôi nghĩ) – Tonin

+0

Cảm ơn, cập nhật. –

2

Thêm dòng sau vào debian/rules:

override_dh_installdeb: 
    dh_installdeb 
    for pkg in $$(dh_listpackages -i); do \ 
     sed -i -e 's/__DEB_VERSION__/$(DEB_VERSION)/' debian/$$pkg/DEBIAN/*; \ 
    done 

Nó sẽ thay thế bất kỳ xảy ra __DEB_VERSION__ trong kịch bản debian của bạn với số phiên bản.

0

Hãy thử điều này:

VERSION=`dpkg -s $DPKG_MAINTSCRIPT_PACKAGE | sed -n 's/^Version: //p'` 
Các vấn đề liên quan