2017-07-24 22 views
9

Sau khi tìm ra cargo build of the same code: spurious compile time errors?, tôi muốn biết làm thế nào để ngăn chặn một vấn đề như vậy:Làm cách nào để ngăn Hàng hóa sáp nhập cùng một sự phụ thuộc với các tính năng khác nhau?

$ cargo new feature_merge 
$ cargo add nmea 
$ cargo check > /dev/null 2>&1 && echo "success" 
success 
$ cargo add cexpr 
$ cargo check > /dev/null 2>&1 || echo "failed" 
failed 
$ cargo rm cexpr && cargo check > /dev/null 2>&1 && echo "success" 
success 

tôi xóa/thêm phụ thuộc mà không cần bất kỳ sửa đổi mã và điều này ảnh hưởng đến kết quả xây dựng.

Nguồn vấn đề, as I described, là cexpr phụ thuộc vào nom như thế này:

nom = {version = "^3", features = ["verbose-errors"] } 

khi nmea mô tả sự phụ thuộc như thế này:

nom = "3.1.0" 

Chỉ với NMEA như một sự phụ thuộc, hàng hóa xây dựng nom với một tập hợp các tính năng, trong khi Cargo xây dựng cexpr và nmea dựa trên danh nghĩa với một tập hợp các tính năng khác.

Tôi muốn một cách để ngăn chặn việc sử dụng sai phạm vi của các bitea mà tôi duy trì.

Tôi muốn có lỗi thời gian biên dịch như "`nom` compiled with wrong features" hoặc buộc Cargo xây dựng hai biến thể của nom.

tôi đã cố gắng điều như vậy trong nmea/Cargo.toml:

nom = { version = "3.1.0", default-features = false } 

này thay đổi gì; vẫn còn một lỗi thời gian biên dịch khi cexpr và nmea được kết hợp.

+0

Có thể có giá trị liên quan đến những người có kiến ​​thức chuyên sâu hơn ở đây; có lẽ bạn nên cân nhắc việc đăng câu hỏi lên r/rust hoặc diễn đàn người dùng rỉ sét, hoặc thậm chí mở một lỗi trên kho lưu trữ github hàng hóa. –

+0

@MatthieuM. Tôi đã đăng https: // github.com/rust-lang/charge/issues/4323 một số thời gian trước – fghj

Trả lời

1

Đó là vấn đề được biết, liên kết liên quan:

cargo issue 1

cargo issue 2

cargo rfc

bản tóm tắt ngắn gọn:

tính năng thùng của có nghĩa vụ phải được phụ

Nói cách khác, mỗi tính năng trong thùng chỉ nên nối thêm chức năng, không thay đổi API. Thật không may là không có tài liệu hướng dẫn tốt nào đề cập đến vấn đề này, và không có tự động hóa để kiểm tra sự bất biến này ít nhất tại thời điểm này. vấn đề cụ thể này liên quan đến nom lỗi (github issue), quote từ đó:

Vấn đề ở đây là, khi sử dụng "lỗi đơn giản", loại nom::simple_errors::Err<E> chỉ đơn giản là một loại bí danh của nom::ErrorKind<E>, trong khi với "lỗi dài dòng" loại nom::verbose_errors::Err<E> là một môi trường chuyên dụng, do đó giao diện "có tính năng" và "không có tính năng" không tương thích.

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