Magento 2: Chạy `setup: di: compile` ** only ** một Module cụ thể?


33

Có thể tạo mã trước cho một mô-đun cụ thể không? IE - Tôi có thể tạo tất cả mã trong hệ thống với

php bin/magento setup:di:compile

Tuy nhiên, điều này có thể mất một thời gian dài. Tôi muốn trước tạo chỉ các tập tin cho một module cụ thể.

php bin/magento setup:di:compile Pulsestorm_Commercebug

Vấn đề cụ thể tôi đang cố gắng giải quyết là giải quyết vấn đề này với một số plugin không được nhận dạng ở chế độ nhà phát triển / mặc định.


Cập nhật câu trả lời của tôi sau khi đọc bài viết "Câu hỏi mở" mới nhất của bạn. Câu trả lời trực tiếp cho câu hỏi là: không. Nó không phức tạp để giải quyết. Nó chỉ không được thực hiện bởi vì không bao giờ được coi là cần thiết.
Anton Kril 8/2/2016

sẽ rất tuyệt khi có khả năng 'biên dịch' trên một mô-đun, sẽ tiết kiệm rất nhiều thời gian khi gỡ lỗi các vấn đề trong phát triển mô-đun.
Karen Baker

Câu trả lời:


20

Trả lời ngắn gọn: Không. Điều đó là không thể với các công cụ được vận chuyển với Magento ngay bây giờ.

Giải thích: Chúng ta phải phân biệt việc tạo mãbiên dịch . Trình biên dịch làm cả hai. Đối với cả hai thao tác, chúng ta cần đọc cấu hình của tất cả các mô-đun magento khác, nếu không đầu ra của chúng sẽ không chính xác hoặc không đầy đủ.

Việc biên dịch cho một mô-đun không có ý nghĩa gì, vì magento sẽ không hoạt động với cấu hình được biên dịch chỉ cho một mô-đun.

Tạo cho một mô-đun có thể có ý nghĩa, nhưng chúng ta sẽ phải đọc chữ ký cấu hình và hàm tạo từ tất cả các mô-đun được cài đặt khác. Không có nó, không phải tất cả các mã có thể được tạo ra. Vì vậy, hoạt động như vậy sẽ không nhanh hơn nhiều so với biên dịch đầy đủ. Chúng tôi có thể nghĩ về nó, nhưng tôi nghĩ rằng lỗi bạn tham chiếu sẽ được sửa trước khi lệnh được thực thi.


1
Thật là một nỗi đau khi phải biên dịch lại mỗi khi một đối số tiêm phụ thuộc mới được thêm vào đâu đó trong quá trình phát triển, có cách nào để bỏ qua hoàn toàn việc tạo mã trong quá trình phát triển không?
snez

6
Bạn không bao giờ phải chạy trình biên dịch trong quá trình phát triển. Bạn vẫn sẽ phải xóa / tạo thư mục nếu bạn sửa đổi chữ ký phương thức, nhưng không cần biên dịch. Biên dịch chỉ để chuyển sang sản xuất.
Anton Kril

12

Tập bin/magentotin thực thi của Magento chỉ là một thành phần của Symfony Console. Điều này có nghĩa là bạn có thể tìm thấy tệp riêng lẻ có thể sửa chữa cho một lệnh duy nhất. Việc đặt tên luôn giống nhau để thiết lập: di: compile, bạn có thể tìm thấy DiCompileCommand.php ( setup/src/Magento/Setup/Console/Command/DiCompileCommand.php).

Nó sẽ luôn chạy exeucte()phương thức vì vậy đó là nơi chúng ta cần tìm. Trong hàm này, bạn sẽ thấy một $operationsvar được đặt, được điền bởi getOperationsConfiguration()phương thức. Phương thức này về cơ bản nói với DiCompileCommand những gì cần biên dịch.

Điều đầu tiên tôi đã thử là chỉ trả về phần tạo mã ứng dụng, như vậy;

private function getOperationsConfiguration(
    array $compiledPathsList
) {
    $excludePatterns = [];
    foreach ($this->excludedPathsList as $excludedPaths) {
        $excludePatterns = array_merge($excludedPaths, $excludePatterns);
    }

    return [
        OperationFactory::APPLICATION_CODE_GENERATOR => [
            'paths' => [
                $compiledPathsList['application'],
                $compiledPathsList['library'],
                $compiledPathsList['generated_helpers'],
            ],
            'filePatterns' => ['php' => '/\.php$/'],
            'excludePatterns' => $excludePatterns,
        ]
    ];
}

Điều này diễn ra khá tốt, thời gian biên dịch đã bị cắt giảm đáng kể;

Compilation was started.
Application code generator... 1/1 [============================] 100% 45 secs 308.8 MiB
Generated code and dependency injection configuration successfully.

Như trái ngược với;

Compilation was started.
Interception cache generation... 7/7 [============================] 100% 3 mins 377.0 MiBB8 MiB
Generated code and dependency injection configuration successfully.

Tất nhiên, điều này đã được mong đợi vì chúng tôi đã cắt bỏ một số thứ. Nhưng bạn không nói rõ các tập tin bạn muốn đã được tạo ra. Không phải tất cả các tệp đều có thể được tạo trên cơ sở mỗi mô-đun, vì ví dụ, các lớp Đánh chặn có thể phụ thuộc vào nhiều mô-đun và do đó sẽ cung cấp cho bạn một đầu ra chức năng hạn chế nếu bạn chỉ chạy điều này cho một mô-đun.

Bạn có thể tìm thấy các máy phát điện có trách nhiệm ở đây;

thiết lập / src / Magento / Cài đặt / Mô-đun / Di / Ứng dụng / Nhiệm vụ / Hoạt động /

Mỗi lớp có một foreach trong đó, nó sẽ cho phép bạn thêm một if / khác với việc tiếp tục bỏ qua các mô-đun / đường dẫn nhất định. Có lẽ sẽ hữu ích khi kiểm tra tài liệu Đối số nhập liệu thành phần của bảng điều khiển Symfony về cách cung cấp đối số vào lệnh.


+1 cho thông tin hữu ích, nhưng lại: "Nhưng bạn đã không chỉ định tệp nào bạn muốn tạo". Điều đó đúng về mặt kỹ thuật, nhưng ẩn ý trong câu hỏi là mong muốn có chế độ mô-đun của tôi được tạo, và sau đó bất kỳ mã bổ sung nào cần được tạo vì tôi đã sử dụng nó trong mô-đun của mình. Mục tiêu cuối cùng của tôi là không cần phải biên dịch toàn bộ hệ thống chỉ vì tôi đang làm việc trên một mô-đun.
Alan Storm

3

bạn có thể nhận ra bởi

gói> mô-đun> đăng ký.php

<?php
use \Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Package_Module', __DIR__);

và hơn là chạy

Mô-đun bin / magento php -f: enable --clear-static-content Package_Module

register.php sẽ nhận ra mô-đun và tuân thủ mô-đun tùy chỉnh của bạn.

Tôi hy vọng điều này sẽ giúp bạn.


2
Thông tin hữu ích, nhưng không phải là những gì tôi đang tìm kiếm. Nó không phải là nội dung tĩnh mà tôi muốn biên dịch, đó là thế hệ chạy khi bạn chạy setup: di: compile. Đó là một điều khác biệt.
Alan Storm

-3

Khi bạn thay đổi hàm tạo của bạn cho lớp được tạo trong yêu cầu trước đó, nó sẽ bị hỏng. Nếu bạn đang có nhu cầu như vậy chỉ cần xóa var/cache, var/generationvar/di(nếu tồn tại) và làm mới trang. Đảm bảo chế độ là nhà phát triển bạn đang làm việc.

(Tôi không nói theo cách này magento sẽ không biên dịch hoặc tạo codebase, vâng, nó sẽ làm như vậy


Điều này dường như đang trả lời một câu hỏi khác nhau.
Alan Storm

Câu trả lời đã được Anton Kril đưa ra ở trên, điều đó rất thẳng thắn và hợp lý. Tôi chỉ cố gắng cung cấp cho bạn một giải pháp thay thế sẽ không cho phép bạn chạy lệnh và xem màn hình của bạn cho đến khi quá trình biên dịch chạy. Làm theo cách này bạn có thể tiết kiệm thời gian của bạn. Trả lời là khá nhiều liên quan đến câu hỏi của bạn. Nếu đây là thái độ của bạn thì không ai đưa ra giải pháp và suy nghĩ.
Laxman Singh
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.