Apache InLong là một nền tảng tích hợp dữ liệu quy mô lớn, được thiết kế để cung cấp khả năng truyền tải dữ liệu tự động, an toàn, đáng tin cậy và hiệu suất cao. Nền tảng này hỗ trợ cả xử lý dữ liệu theo lô (batch) và theo luồng (stream), giúp các doanh nghiệp dễ dàng xây dựng các hệ thống phân tích, mô hình hóa và ứng dụng dựa trên dữ liệu luồng. Cộng đồng Apache InLong luôn chào đón những đóng góp từ các nhà phát triển để cải thiện và mở rộng dự án.
1. Gửi hoặc đảm nhận một ISSUE
Trong quá trình phát triển mã nguồn mở, mọi thay đổi, dù là sửa lỗi (bug) hay bổ sung tính năng mới (feature), đều cần được gắn với một ISSUE tương ứng. ISSUE đóng vai trò là tài liệu mô tả vấn đề hoặc yêu cầu, giúp cộng đồng theo dõi và quản lý công việc.
Nếu bạn phát hiện lỗi khi xem tài liệu, biên dịch mã nguồn hoặc sử dụng nền tảng InLong đã triển khai, hoặc bạn có ý tưởng cải tiến, hãy tạo một ISSUE mới. Bạn có thể gửi ISSUE tại liên kết sau: Gửi ISSUE.
Vui lòng tuân thủ chặt chẽ các quy tắc đặt tên tiêu đề ISSUE được quy định chi tiết tại: Quy tắc đặt tên ISSUE.
2. Sao chép mã nguồn và thiết lập môi trường cục bộ
Để bắt đầu đóng góp, bạn cần sao chép (clone) mã nguồn của dự án về máy tính cục bộ và thiết lập môi trường phát triển. Vui lòng tham khảo các bước chi tiết trên trang hướng dẫn chính thức về Đóng góp mã nguồn Apache InLong.
Trước khi biên dịch, hãy đảm bảo bạn đã cấu hình Maven để có thể truy cập các kho lưu trữ trung tâm (central repositories). Hướng dẫn cấu hình Maven có sẵn tại: Cấu hình Maven.
Khi biên dịch mã nguồn, bắt buộc phải sử dụng tham số install. Điều này giúp đảm bảo rằng tất cả các module phụ thuộc được xây dựng và cài đặt cục bộ, tránh các lỗi thiếu phụ thuộc trong quá trình phát triển. Lệnh biên dịch mẫu:
mvn clean install -s /duong/dan/den/maven/conf/settings-public.xml
Hãy thay thế /duong/dan/den/maven/conf/settings-public.xml bằng đường dẫn thực tế đến tệp cấu hình Maven của bạn.
3. Cấu hình phong cách mã nguồn (Bắt buộc)
Để duy trì tính nhất quán và dễ đọc cho mã nguồn, dự án Apache InLong áp dụng một bộ quy tắc định dạng mã nguồn thống nhất. Bạn phải tải xuống tệp cấu hình dưới đây và nhập vào IDE của mình (ví dụ: IntelliJ IDEA). Lưu nội dung sau dưới dạng tệp XML:
Nhấn vào đây để xem cấu hình XML
<code_scheme name="InLong-CodeStyle" version="173">
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="INDENT_SIZE" value="4"/>
<option name="CONTINUATION_INDENT_SIZE" value="8"/>
<option name="TAB_SIZE" value="4"/>
<option name="USE_TAB_CHARACTER" value="false"/>
<option name="SMART_TABS" value="false"/>
<option name="LABEL_INDENT_SIZE" value="0"/>
<option name="LABEL_INDENT_ABSOLUTE" value="false"/>
<option name="USE_RELATIVE_INDENTS" value="false"/>
</value>
</option>
<option name="FORMATTER_TAGS_ENABLED" value="true"/>
<JSCodeStyleSettings version="0">
<option name="INDENT_CHAINED_CALLS" value="false"/>
</JSCodeStyleSettings>
<JavaCodeStyleSettings>
<option name="INSERT_INNER_CLASS_IMPORTS" value="true"/>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999"/>
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999"/>
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value/>
</option>
<option name="JD_ALIGN_PARAM_COMMENTS" value="false"/>
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false"/>
<option name="JD_P_AT_EMPTY_LINES" value="false"/>
<option name="JD_PRESERVE_LINE_FEEDS" value="true"/>
<option name="JD_INDENT_ON_CONTINUATION" value="true"/>
</JavaCodeStyleSettings>
<Python>
<option name="USE_CONTINUATION_INDENT_FOR_ARGUMENTS" value="true"/>
</Python>
<ScalaCodeStyleSettings>
<option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true"/>
</ScalaCodeStyleSettings>
<TypeScriptCodeStyleSettings version="0">
<option name="INDENT_CHAINED_CALLS" value="false"/>
</TypeScriptCodeStyleSettings>
<XML>
<option name="XML_ALIGN_ATTRIBUTES" value="false"/>
</XML>
<codeStyleSettings language="CSS">
<indentOptions>
<option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="ECMA Script Level 4">
<option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
<option name="ALIGN_MULTILINE_FOR" value="false"/>
<option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="EXTENDS_LIST_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3"/>
</codeStyleSettings>
<codeStyleSettings language="HTML">
<indentOptions>
<option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="RIGHT_MARGIN" value="120"/>
<option name="LINE_COMMENT_AT_FIRST_COLUMN" value="false"/>
<option name="BLOCK_COMMENT_AT_FIRST_COLUMN" value="false"/>
<option name="LINE_COMMENT_ADD_SPACE" value="true"/>
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false"/>
<option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="BLANK_LINES_BEFORE_PACKAGE" value="1"/>
<option name="BLANK_LINES_AFTER_CLASS_HEADER" value="1"/>
<option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
<option name="ALIGN_MULTILINE_RESOURCES" value="false"/>
<option name="ALIGN_MULTILINE_FOR" value="false"/>
<option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="EXTENDS_LIST_WRAP" value="1"/>
<option name="THROWS_KEYWORD_WRAP" value="1"/>
<option name="METHOD_CALL_CHAIN_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="WRAP_COMMENTS" value="true"/>
<option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3"/>
<indentOptions>
<option name="INDENT_SIZE" value="4"/>
<option name="CONTINUATION_INDENT_SIZE" value="8"/>
<option name="TAB_SIZE" value="4"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JSON">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="RIGHT_MARGIN" value="80"/>
<option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
<option name="ALIGN_MULTILINE_FOR" value="false"/>
<option name="CALL_PARAMETERS_WRAP" value="1"/>
<option name="METHOD_PARAMETERS_WRAP" value="1"/>
<option name="BINARY_OPERATION_WRAP" value="1"/>
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true"/>
<option name="TERNARY_OPERATION_WRAP" value="1"/>
<option name="TERNARY_OPERATION_SIGNS_ON_NEXT_LINE" value="true"/>
<option name="FOR_STATEMENT_WRAP" value="1"/>
<option name="ARRAY_INITIALIZER_WRAP" value="1"/>
<option name="IF_BRACE_FORCE" value="3"/>
<option name="DOWHILE_BRACE_FORCE" value="3"/>
<option name="WHILE_BRACE_FORCE" value="3"/>
<option name="FOR_BRACE_FORCE" value="3"/>
<indentOptions>
<option name="INDENT_SIZE" value="2"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="PROTO">
<option name="RIGHT_MARGIN" value="80"/>
<indentOptions>
<option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="2"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="protobuf">
<option name="RIGHT_MARGIN" value="120"/>
<indentOptions>
<option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="2"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="Python">
<option name="KEEP_BLANK_LINES_IN_CODE" value="1"/>
<option name="RIGHT_MARGIN" value="80"/>
<option name="ALIGN_MULTILINE_PARAMETERS" value="false"/>
<indentOptions>
<option name="INDENT_SIZE" value="2"/>
<option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="SASS">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="SCSS">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="TypeScript">
<indentOptions>
<option name="INDENT_SIZE" value="2"/>
<option name="TAB_SIZE" value="2"/>
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="XML">
<option name="RIGHT_MARGIN" value="120"/>
<indentOptions>
<option name="INDENT_SIZE" value="4"/>
<option name="CONTINUATION_INDENT_SIZE" value="8"/>
<option name="TAB_SIZE" value="4"/>
</indentOptions>
</codeStyleSettings>
</code_scheme>
Sau khi tải xuống, hãy nhập cấu hình này vào IDE của bạn. Ví dụ, trong IntelliJ IDEA, bạn có thể thực hiện theo các bước sau:
- Mở
Settings/Preferences. - Đi tới
Editor > Code Style. - Nhấp vào biểu tượng bánh răng cưa (hoặc nút
Manage) và chọnImport Scheme > IntelliJ IDEA code style XML. - Chọn tệp XML bạn vừa lưu.
Hãy đảm bảo rằng thứ tự sắp xếp các gói nhập (import order) cũng được cấu hình chính xác theo quy định của dự án sau khi nhập.
4. Cài đặt plugin tự động định dạng (Khuyến nghị)
Để giúp bạn tuân thủ phong cách mã nguồn một cách dễ dàng, chúng tôi khuyến nghị cài đặt plugin Save Actions cho IDE của bạn (ví dụ: trong IntelliJ IDEA, tìm kiếm và cài đặt từ Marketplace).
Sau khi cài đặt, hãy cấu hình plugin để nó tự động định dạng mã nguồn mỗi khi bạn lưu tệp. Ví dụ, trong IntelliJ IDEA, bạn có thể truy cập Settings/Preferences > Tools > Save Actions và kích hoạt các tùy chọn như Reformat file và Optimize imports. Plugin này sẽ tự động áp dụng các quy tắc định dạng cho các tệp bạn đã thêm hoặc sửa đổi.
5. Gửi mã nguồn
Khi bạn đã hoàn tất các thay đổi mã nguồn, hãy cam kết (commit) chúng vào kho lưu trữ Git cục bộ của bạn. Điều quan trọng là phải tuân thủ định dạng thông điệp cam kết (commit message) được dự án yêu cầu. Bạn có thể tham khảo hướng dẫn về định dạng thông điệp cam kết.
Sau đó, bạn cần tạo một Pull Request (PR) từ nhánh phát triển của mình lên kho lưu trữ chính của dự án Apache InLong. Pull Request là yêu cầu để mã nguồn của bạn được cộng đồng xem xét và hợp nhất vào dự án. Chi tiết về quy trình gửi PR và các bước tiếp theo có thể được tìm thấy trong tài liệu Đóng góp mã nguồn.