2015-01-03 25 views
6

Tôi đã tìm kiếm một lúc nhưng không thể tìm thấy bất kỳ câu trả lời thỏa đáng nào:Conda hoạt động như thế nào trong nội bộ?

Làm thế nào để conda (http://conda.pydata.org) hoạt động trong nội bộ? Mọi chi tiết đều được chào đón ...

Hơn nữa, vì nó là python bất khả tri và dường như hoạt động rất tốt và trôi chảy, tại sao nó không được sử dụng như một người quản lý gói mục đích chung như apt hay yum?

Những hạn chế nào khi chỉ sử dụng conda làm người quản lý gói? Nó có hoạt động không?

Hoặc cách khác vòng, tại sao ví dụ: apt và yum không thể cung cấp các chức năng mà conda cung cấp? Là conda "tốt hơn" so với những người quản lý gói hoặc chỉ khác nhau?

Cảm ơn mọi gợi ý!

+0

Đây là một câu hỏi khá rộng. Bạn quan tâm đến hoạt động nội bộ nào? – vicvicvic

+0

Liệu nó có sử dụng một số loại container, hoặc liên kết tĩnh của tất cả các phụ thuộc, tại sao nó là "nền tảng chéo"? Ví dụ, bất cứ ai từng cố gắng cài đặt một cách numpy biết, những gì làm việc trên debian, không hoạt động nhất thiết trên ubuntu ... – user27564

Trả lời

13

Tôi giải thích rất nhiều điều này trong số SciPy 2014 talk của mình. Hãy để tôi đưa ra một phác thảo nhỏ ở đây.

Trước hết, gói conda thực sự đơn giản. Nó chỉ là một tarball của các tập tin được cài đặt, cùng với một số siêu dữ liệu trong một thư mục info. Ví dụ gói conda cho python là một tarball của các tập tin

info/ 
    files 
    index.json 
    ... 
bin/ 
    python 
    ... 
lib/ 
    libpython.so 
    python2.7/ 
     ... 
    ... 
... 

Bạn có thể thấy chính xác những gì nó trông giống như bằng cách nhìn vào các gói chiết xuất trong thư mục Anaconda pkgs. Thông số đầy đủ là http://conda.pydata.org/docs/spec.html.

Khi điều kiện cài đặt này, nó trích xuất tarball vào thư mục pkgs và liên kết chặt chẽ các tệp vào môi trường cài đặt. Cuối cùng, một số tệp có một số đường dẫn cài đặt được mã hóa cứng có thay thế này (thường là các dòng shebang).

Về cơ bản là nó. Có một số thứ khác xảy ra về độ phân giải phụ thuộc, nhưng một khi nó biết những gì gói của nó sẽ cài đặt đó là cách nó thực hiện nó.

Quá trình xây dựng một gói phức tạp hơn một chút. @ Mattexx của câu trả lời và tài liệu nó liên kết để mô tả một chút về cách kinh điển của việc xây dựng một gói bằng cách sử dụng xây dựng conda.

Để trả lời các câu hỏi khác của bạn:

Hơn nữa, vì nó là trăn thuyết bất khả tri và dường như làm việc rất tốt và thành thạo, tại sao nó không được sử dụng như một nhà quản lý gói tin tổng hợp như apt hoặc yum?

Bạn chắc chắn có thể. Điều duy nhất hạn chế đây là tập hợp các gói đã được xây dựng cho conda. Trên Windows, đây là một lựa chọn rất hay, vì không có bất kỳ trình quản lý gói hệ thống nào giống như trên Linux.

Những hạn chế chỉ sử dụng conda làm người quản lý gói là gì? Nó có hoạt động không?

Nó sẽ hoạt động, giả sử bạn có gói conda cho mọi thứ bạn quan tâm.Hạn chế chính là conda chỉ muốn cài đặt mọi thứ vào môi trường conda, vì vậy những thứ yêu cầu vị trí cài đặt cụ thể trên hệ thống có thể không phù hợp với conda (mặc dù vẫn có thể thực hiện được nếu bạn đặt vị trí đó làm đường dẫn môi trường) . Hoặc ví dụ, conda có thể không phải là một sự thay thế phù hợp cho các nhà quản lý gói "cấp dự án" như bower.

Ngoài ra, có thể không nên sử dụng conda để quản lý thư viện cấp hệ thống (thư viện phải được cài đặt trong tiền tố /), như phần mở rộng hạt nhân hoặc hạt nhân, trừ khi bạn xây dựng phân phối sử dụng dấu mũ một người quản lý gói một cách rõ ràng.

Điều chính tôi nói những điều này là các gói conda thường được tạo thành relocatable, có nghĩa là tiền tố cài đặt của gói không quan trọng. Đây là lý do tại sao đường dẫn mã hóa cứng được thay đổi như một phần của quá trình cài đặt, ví dụ. Nó cũng có nghĩa là thư viện động được xây dựng với xây dựng conda sẽ có RPATHs của họ (trên Linux) và cài đặt tên (trên OS X) thay đổi tự động để sử dụng đường dẫn tương đối thay vì các đường dẫn tuyệt đối.

Hoặc cách khác vòng, tại sao ví dụ: apt và yum không thể cung cấp các chức năng mà conda cung cấp? Là conda "tốt hơn" so với những người quản lý gói hoặc chỉ khác nhau?

Bằng một số cách, điều đó tốt hơn và theo một số cách thì không. Trình quản lý gói hệ thống của bạn biết hệ thống của bạn, và có các gói trong đó sẽ không ở trong tình trạng hỗn loạn (và một số, giống như hạt nhân, có lẽ không nên ở trong tình trạng hỗn loạn).

Ưu điểm chính của conda là khái niệm môi trường. Vì các gói được tạo để có thể định vị lại, bạn có thể cài đặt cùng một gói ở nhiều nơi và có hiệu quả cài đặt hoàn toàn độc lập mọi thứ, về cơ bản là miễn phí.

Liệu nó sử dụng một số loại Containerization

Không, chỉ "Containerization" là có cài đặt thư mục riêng biệt và làm bao bì định vị.

hoặc liên kết tĩnh của tất cả các phụ thuộc,

Các phụ thuộc liên kết là hoàn toàn tùy thuộc vào gói riêng của mình. Một số gói liên kết tĩnh phụ thuộc của họ, một số không. Các thư viện được liên kết động có đường dẫn tải thay đổi như tôi đã mô tả ở trên để có thể định vị lại.

tại sao lại có "nền tảng chéo"?

"Nền tảng chéo" trong trường hợp này có nghĩa là "hệ điều hành chéo". Mặc dù cùng một gói nhị phân không thể hoạt động trên OS X, Linux và Windows, điểm chính là bản thân conda hoạt động giống nhau trên cả ba, vì vậy nếu bạn có cùng một gói được xây dựng cho cả ba nền tảng, bạn có thể quản lý chúng giống nhau bất kể bạn đang ở đâu.

+0

Cảm ơn rất nhiều !!! Chính xác những gì tôi đang tìm kiếm!! – user27564

3

Tôi không có chuyên gia về phần mềm, nhưng tôi đã sử dụng conda để duy trì một kho lưu trữ nội bộ trong vài tháng, vì vậy tôi có thể chia sẻ thông tin chi tiết về "người dùng nâng cao". Có rất nhiều câu hỏi ở đây, vì vậy tôi sẽ cố gắng trả lời chúng theo thứ tự.

Làm thế nào để conda (http://conda.pydata.org) hoạt động trong nội bộ? Mọi chi tiết đều được chào đón ...

Tham chiếu ngắn gọn nhất mà tôi có thể chia sẻ là conda-build doc, giải thích chi tiết về công thức nấu ăn.

TL; DR Bí quyết là các thư mục có tệp cấu hình meta.yaml mô tả gói về tên, phiên bản, vị trí nguồn, phụ thuộc (xây dựng, thử nghiệm, chạy) và thử nghiệm cơ bản để chạy sau khi cài đặt. Nó cũng chứa (các) script xây dựng (build.sh và/hoặc bld.bat cho Linux và giành chiến thắng), thực thi bất kỳ bước xây dựng nào khác ngoài tải xuống nguồn.

Cài đặt bao gồm (trong ngắn hạn) tải xuống nguồn, tạo môi trường xây dựng, xây dựng, tạo môi trường thử nghiệm và thử nghiệm. Bạn có thể cài đặt một cái gì đó trên toàn hệ thống hoặc cài đặt nó trong một môi trường:

conda install -n myenv mypkg # install only in myenv 
conda install mypkg # install globally 

Kích hoạt một môi trường làm việc hoàn toàn giống với virtualenv:

source activate myenv 

những hạn chế của việc sử dụng chỉ conda như là gì quản lý gói? Nó có hoạt động không?

Nó sẽ hoạt động. Bạn có thể cài đặt bất cứ điều gì bạn muốn với conda, nếu bạn có một công thức hỗ trợ môi trường của bạn. Vấn đề bạn sẽ gặp phải là hỗ trợ gói. Các nhà bảo trì và người dùng Conda đã tạo ra một hệ sinh thái các gói trên nhiều kênh khác nhau, nhưng hỗ trợ cho các gói nhị phân được giới hạn khá nhiều đối với các gói thường được các gói Python yêu cầu và nhiều gói này chỉ được hỗ trợ trên một hoặc hai nền tảng. apt, yum, vv người dùng duy trì tất cả các loại công cụ cho nền tảng tương ứng của họ. Trong trường hợp của chúng tôi, chúng tôi cần hỗ trợ Ubuntu và OSX, vì vậy chúng tôi duy trì nhiều gói nhị phân phụ thuộc vào nền tảng thông qua con rối và ma thuật ngu xuẩn khác, và chúng tôi sử dụng conda để duy trì gói Python cho hai nền tảng này. Nếu gói conda tồn tại cho tất cả các gói nhị phân mà chúng tôi sử dụng, tôi có thể cân nhắc việc sử dụng conda thay vì apt, brew, v.v ... nhưng tôi sẽ mạo hiểm thực hiện bảo trì công thức quan trọng nếu công thức mà chúng tôi sử dụng đã lỗi thời.Điều này là tốt cho chúng tôi trong trường hợp quản lý gói Python, trong đó conda lấp đầy một khoảng trống rất lớn, nhưng tôi chưa sẵn sàng thực hiện điều đó đối với các gói mà chúng tôi có các công cụ hiện có để duy trì. Chúng ta sẽ thấy nếu suy nghĩ của tôi thay đổi khi hệ sinh thái conda trưởng thành. Một công cụ để cai trị tất cả sẽ là tốt đẹp, nhưng tôi không nghĩ rằng conda đã sẵn sàng cho tôi để thực hiện bước nhảy đó.

Nó có sử dụng một số loại container hoặc liên kết tĩnh của tất cả các phụ thuộc, tại sao nó lại "nền tảng chéo"?

"Nền tảng chéo" có thể có nhiều ý nghĩa. Đối với gói Python, nền tảng chéo có nghĩa là bạn có thể tạo môi trường với bất kỳ phiên bản nào của python và các gói bạn cần. Đối với Linux/giành được hương vị và bản phân phối, bạn có thể làm nhiều như bạn muốn trong kịch bản xây dựng dựa trên môi trường. Ví dụ, hãy xem conda build script for qt. Nó có cài đặt thích hợp cho OSX và Linux. Kịch bản có thể làm bất cứ điều gì nó muốn mặc dù. Bạn có thể chuyển đổi dựa trên phiên bản hệ điều hành hoặc bất cứ điều gì bạn muốn. Nhiều công thức nấu ăn sẽ đơn giản thất bại nếu chúng không hỗ trợ nền tảng cài đặt.

Hy vọng bạn thấy điều này hữu ích.

+0

Các gói có thực sự được xây dựng trên máy người dùng không? Ấn tượng của tôi là xây dựng conda được sử dụng để đi công thức-> gói. Gói này sau đó được cung cấp (ví dụ: binstar.org) và tải xuống và cài đặt bằng cách sử dụng conda. Không phải "xây dựng" gói có vẻ là một tính năng được chào hàng của Conda (xem ví dụ: https://speakerdeck.com/teoliphant/packaging-and-deployment-with-conda) – vicvicvic

+0

@vicvicvic Bạn _can_ xây dựng các gói trên máy người dùng , nếu bạn cài đặt 'conda-build'. Nhưng bạn sẽ không thực sự làm điều này trừ khi bạn đang phát triển/triển khai một gói, và sau đó có bạn sẽ tải chúng lên binstar hoặc repo conda của riêng bạn để cài đặt bất cứ nơi nào. Bí quyết ở đây là gói chỉ được thử nghiệm trên nền tảng mà nó được xây dựng, vì vậy lý tưởng bạn sẽ xây dựng trong cùng một env như phần còn lại của người dùng. Bạn có thể gặp rắc rối nếu bạn sử dụng một bản phân phối sau để xây dựng hơn là bạn sử dụng để cài đặt do không tương thích ngược của các tệp nhị phân. – mattexx

+0

Rất hữu ích! Nhưng bạn có bất kỳ ý tưởng nếu nó là liên kết tĩnh của tất cả các phụ thuộc. Ví dụ: đối với 'bình thường', bạn cần thư viện BLAS được cài đặt trong hệ thống của bạn, nhưng không phải nếu bạn sử dụng conda, thì BLAS đến từ đâu? Điều này sau đó có nghĩa là, trong gói numpy là tất cả các phụ thuộc cứng nướng trong, trong một nhị phân ... – user27564

0

Tôi thấy rằng không ai thực sự hiểu cách thức hoạt động của người phối ngẫu sẵn sàng chia sẻ kiến ​​thức của họ. Điều này là không may...

tôi có thể cung cấp chuỗi cấp cao của conda build hành động:

  1. Trông tại meta.yaml để tìm RUN + BUILD DEPS
  2. Tạo env mới gọi là: '_build'
    1. Cài đặt RUN + Phụ thuộc BUILD từ meta.yaml
  3. Tìm nạp mã nguồn tới conda_bld/work
  4. xây dựng trọn gói:
    1. take 'snapshot1' của môi trường đầy đủ
    2. home_dir: 'conda_bld/nơi làm việc, chạy: 'sh build.sh' 'setup.py cài đặt conda_bld/công việc'(cài đặt localy để env _build)
    3. take 'snapshot2' của môi trường đầy đủ
    4. nội dung trọn gói là 'diff snapshot1 snapshot2'
  5. Chạy thử nghiệm:
    1. Tạo '_test' ENV với '{chỉ xây dựng gói, RUN DEPS}'
    2. chạy thử nghiệm

này với @asmeurer link youtube trên mặt nên giúp bạn bắt đầu.

Các vấn đề liên quan