Làm cách nào để sửa đổi PKGBUILD sử dụng nguồn git để chỉ lấy một bản sao nông?


18

Hôm trước tôi đã thử cài đặt opencv-gittừ AUR với makepkgtrên Arch Linux. Tất nhiên nó lấy từ kho git như tên chỉ ra. Điều này kéo 1Gb. Tôi đang đọc về việc làm một bản sao nông với git. Khi tôi nhìn vào PKGBUILDtập tin, sử dụng grep git PKGBUILD, tôi thấy:

pkgname="opencv-git"
makedepends=('git' 'cmake' 'python2-numpy' 'mesa' 'eigen2')
provides=("${pkgname%-git}")
conflicts=("${pkgname%-git}")
source=("${pkgname%-git}::git+http://github.com/Itseez/opencv.git"
    cd "${srcdir}/${pkgname%-git}"
    git describe --long | sed -r 's/([^-]*-g)/r\1/;s/-/./g'
    cd "${srcdir}/${pkgname%-git}"
    cd "${srcdir}/${pkgname%-git}"
    cd "${srcdir}/${pkgname%-git}"
    install -Dm644 "LICENSE" "${pkgdir}/usr/share/licenses/${pkgname%-git}/LICENSE"

Có cách nào để sửa đổi công thức hoặc makepkglệnh chỉ lấy một bản sao nông (phiên bản mới nhất của nguồn là thứ tôi muốn) và không phải là kho lưu trữ đầy đủ để tiết kiệm không gian và băng thông? Đọc man 5 PKGBUILDkhông cung cấp cái nhìn sâu sắc mà tôi đang tìm kiếm. Cũng xem nhanh qua makepkgvà các pacman trang - dường như không thể tìm ra cách để làm điều đó.


"Cuối cùng, tôi đã thất bại trong việc xây dựng thành công công thức." Bạn đã làm gì chính xác, và những gì đã sai? Cung cấp thêm chi tiết, xin vui lòng. Như ai đó đã từng nói với tôi trên IRC, thật không may, chúng tôi đã để những quả cầu pha lê ở nhà. Nghe có vẻ như, đọc giữa các dòng, như thể các git repos không thể sao chép thành công, có thể là do sự cố mạng? Nhưng tôi chỉ đoán thôi. Hãy rõ ràng, xin vui lòng.
Faheem Mitha

Một phỏng đoán có giáo dục là bạn có thể chia quá trình thành hai phần. Đầu tiên nhân bản repos git như một bản sao nông hoặc bất cứ điều gì. Sau đó áp dụng công thức. Tôi đoán bạn có thể thay thế địa chỉ mạng git+http://github.com/Itseez/opencv.gittrong công thức AUR bằng tên đường dẫn cục bộ. Bạn đã thử chưa? Nếu hệ thống xây dựng này buộc bạn phải sao chép một repos ngay cả khi bạn có sẵn nó ở địa phương, thì đó là một điều thú vị.
Faheem Mitha

@FaheemMitha Cảm ơn bạn, tôi đã xóa tham chiếu đến thất bại khi xây dựng - Tôi không quan tâm. Tôi đang tìm kiếm một giải pháp tích hợp có thể dựa trên một cái gì đó giống như những gì bạn mô tả. Tôi nghĩ rằng có thể có tùy chọn không tải xuống nếu có nội dung cục bộ ...

Nếu lý do chính của bạn để đặt câu hỏi này là để tránh sử dụng băng thông / không gian không cần thiết, thì sẽ không hại khi nói một cách rõ ràng như vậy. Như tôi đã nói, hãy thử chỉ sử dụng đường dẫn cục bộ - điều này có thể sẽ hoạt động theo nguyên tắc ít gây bất ngờ nhất. Nếu tùy chọn chỉ định một bản sao nông không được đưa ra trên trang man, có thể chức năng đó không khả dụng. Tôi đề nghị hỏi trong một diễn đàn Arch thích hợp, có lẽ là một danh sách gửi thư dành riêng cho hệ thống xây dựng đó. Đầu tiên làm rõ liệu chức năng đó có tồn tại hay không; nếu không, bạn có thể gửi một lỗi danh sách mong muốn.
Faheem Mitha

Câu trả lời:


13

Điều này có thể được thực hiện bằng cách sử dụng một dlagent tùy chỉnh . Tôi không thực sự hiểu bao bì Arch hoặc cách thức hoạt động của các dlagents, vì vậy tôi chỉ có câu trả lời hack, nhưng nó hoàn thành công việc.

Ý tưởng là sửa đổi PKGBUILD để sử dụng tác nhân tải xuống tùy chỉnh. Tôi đã sửa đổi nguồn

"${pkgname%-git}::git+http://github.com/Itseez/opencv.git"

vào

"${pkgname%-git}::mygit://opencv.git"

và sau đó định nghĩa một dlagent mới được gọi là mygitbản sao nông. Tôi đã làm điều này bằng cách thêm vào DLAGENTSmảng trong /etc/makepkg.confdlagent sau:

'mygit::/usr/bin/git clone --depth 1 http://github.com/Itseez/opencv.git'

Tôi đoán là bạn có thể có thể định nghĩa tác nhân tải xuống này ở một nơi khác, nhưng tôi không biết làm thế nào. Cũng lưu ý rằng kho lưu trữ đang được nhân bản được mã hóa cứng vào lệnh. Một lần nữa, điều này có lẽ có thể tránh được. Cuối cùng, vị trí tải xuống không phải là những gì PKGBUILD mong đợi. Để khắc phục điều này, tôi chỉ cần di chuyển kho lưu trữ sau khi tải xuống. Tôi làm điều này bằng cách thêm

mv "${srcdir}/../mygit:/opencv.git" "${srcdir}/../${pkgname%-git}"

ở đầu pkgverhàm.

Tôi nghĩ rằng giải pháp sạch hơn sẽ là tìm ra những gì git+httpdlagent đang làm và làm lại điều đó tạm thời. Điều này nên tránh tất cả các khía cạnh hack của giải pháp.


Cảm ơn bạn, điều này làm việc. Vâng, nó sẽ cần một số công việc để trừu tượng hóa nó để làm việc trong các trường hợp khác ngoài trường hợp này. Nhưng nó đáng để điều tra và câu trả lời của bạn là một bằng chứng khái niệm hợp lệ. Tôi đã thay đổi câu trả lời được chọn cho bạn.

11

Cá nhân tôi đã sửa đổi tập lệnh makepkg và nó hoạt động như một cơ duyên:

# vim `which makepkg` +/clone
...
541         msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
542         if ! git clone --mirror "$url" "$dir"; then
543             error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
...

Nối "--mirror --single-Branch --depth 1" vào lệnh "git clone":

541         msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
542         if ! git clone --mirror --single-branch --depth 1 "$url" "$dir"; then
543             error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"

Đây là một cái nhìn khác:

--- makepkg ...
+++ makepkg-patched ...
@@ -539,7 +539,7 @@

    if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
        msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
-       if ! git clone --mirror "$url" "$dir"; then
+       if ! git clone --mirror --single-branch --depth 1 "$url" "$dir"; then
            error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
            plain "$(gettext "Aborting...")"
            exit 1

Cài đặt softethervpn-git hiện chỉ tải xuống 100M thay vì 468M trước khi hack.
sửa đổi

Xuất sắc! Cảm ơn rất nhiều! Điều này nên được mặc định.
ccpizza

Lưu ý: điều này sẽ thất bại với PKGBUILD tùy thuộc vào thẻ chẳng hạn. Xem cuộc thảo luận này . Tuy nhiên nó có lẽ có thể được cố định bằng cách sử dụng các mảnh vỡ có ( branch, tag, commitvv).
BenC

7
Lưu ý: bây giờ /usr/share/makepkg/source/git.shnên được vá thay thế
nponeccop

6

Theo https://bugs.archlinux.org/task/23065 (tín dụng cho jasonwryan), việc thêm chức năng nhân bản nông cho AUR PKGBUILD là một mục trong danh sách mong muốn đã được đóng vào Thứ Bảy, ngày 5 tháng 3 năm 2011 với nhận xét:

Lý do đóng cửa: Không thực hiện

Điều này cho thấy rằng nó sẽ không xảy ra trừ khi có ai đó gửi một bản vá.

Như tôi đã gợi ý cho người đăng trong các bình luận, những gì anh ta đang cố gắng làm gần như chắc chắn có thể được thực hiện bằng cách chia quá trình thành hai bước:

  1. Nhân bản kho git bằng cách sử dụng bản sao nông
  2. Chạy công thức PKGBUILD, nhưng chỉ vào bản sao địa phương. Tôi không phải là Người dùng Arch, vì vậy không biết liệu đây có phải là trường hợp không, nhưng tôi rất ngạc nhiên về một hệ thống xây dựng gói buộc người dùng phải sao chép kho từ xa để xây dựng các gói.

Cảm ơn bạn. Trong các bình luận trong liên kết, có cuộc thảo luận về cách sửa đổi này có thể mang lại hậu quả không mong muốn cho quy trình làm việc của tập lệnh. Vấn đề là làm thế nào git cư trú và liên kết các đối tượng bị thiếu, v.v. - việc sử dụng đĩa sẽ không có ích nếu tôi hiểu đúng. Quả thực tôi đã thử thực hiện một bản sao nông trong thư mục công thức, kết quả là 1GB + giống nhau nhưng được chọn bởi makepkg(pkgver phàn nàn một chút nhưng vẫn còn) và cũng hoạt động!

2

Nếu bạn tạo một bản sao nông của kho lưu trữ trong cùng thư mục với PKGBUILD, bạn có thể sử dụng makepkg --holdverđể ngăn makepkgcập nhật phần còn lại của kho lưu trữ. Điều này loại bỏ sự cần thiết phải thay đổi PKGBUILD, makepkg.confhoặc makepkgbản thân; tuy nhiên, nhân bản / cập nhật kho lưu trữ cần phải được thực hiện thủ công.

Như một ví dụ với cling-git, thông thường sẽ nhân bản toàn bộ llvmclang:

$ git clone --mirror --depth=1 --branch=cling-patches http://root.cern.ch/git/llvm.git llvm
$ git clone --mirror --depth=1 --branch=cling-patches http://root.cern.ch/git/clang.git clang
$ git clone --mirror --depth=1 http://root.cern.ch/git/cling.git cling

$ makepkg --holdver

Từ trang người đàn ông makepkg:

--holdver
    When using VCS sources (PKGBUILD(5)) any currently checked out source
    will not be updated to the latest revision.

Lưu ý rằng makepkg vẫn sẽ sao chép các repos chưa có, điều đó có nghĩa là tôi có thể bỏ qua việc sao chép thủ công clingkho lưu trữ trong ví dụ trên vì nó không quá lớn.


1

Nếu bạn không muốn sửa đổi tập lệnh makepkg.

như được phác thảo ở đây , chỉ DEVELSRCDIRvào /etc/yaourtrchoặc ~/.yaourtrctập tin vào một thư mục liên tục. Sau đó, tất cả các kiểm tra kho lưu trữ (git / svn / ...) sẽ xảy ra trong thư mục này. Khi kho lưu trữ được sao chép, sau đó chỉ tìm nạp nhanh với các phiên bản mới nhất sẽ được thực hiện thay vì sao chép đầy đủ mỗi lần.

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.