我有一个服务器应用程序,必须在Windows和Linux系统上运行。问题从我使用的mdns/zeroconf模块开始。
我两者都用:
1.用于Linux的zeroconf
(https://docs.rs/zeroconf/latest/zeroconf/)
1.用于Windows的astro_dnssd
(https://github.com/astrohq/astro-dnssd)
- 为什么我必须使用2个模块来做同样的事情?**
由于zeroconf
支持Linux但不支持Windows,而astro_dnssd
使用bonjour-compatibility layer on top of Avahi for Linux which no longer supported,但astro_dnssd
在Windows上运行良好,因此我不得不使用2个模块来完成基本相同的任务
- 我的
main.rs
:**
- 我的
// asto_dnssd can be compiled on both Windows and Linux, but doesn't work as intended on Linux
use astro_dnssd::DNSServiceBuilder;
// this modules doesn't even compile on Windows
// so I had to manually disable this line and everything that uses zeroconf to run my server app on Windows, including the "Cargo.toml" file
use zeroconf::prelude::*;
use zeroconf::{MdnsService, ServiceRegistration, ServiceType, TxtRecord};
- 问题是:**
到目前为止,每当我在Windows上工作时,我必须手动禁用zeroconf
(通过注解该行),当我在Linux上工作时,我必须再次启用它。这是一项乏味的工作,从长远来看是不可持续的。是否可以使用env变量或env::consts::OS
来检测并在Rust中进行"条件导入"?例如:
let current_os = env::consts::OS;
match current_os {
"windows" => {
use astro_dnssd::DNSServiceBuilder;
//... the rest of the code
}
"linux" => {
use zeroconf::prelude::*;
use zeroconf::{MdnsService, ServiceRegistration, ServiceType, TxtRecord};
// ... the rest of the code
}
_ => {
panic!("This operating system is not supported yet")
}
};
1条答案
按热度按时间zdwk9cvp1#
有条件导入
在Rust中可以使用
cfg
进行条件编译。为了提高可读性,您可能希望将特定于平台的部分放在模块中。
有条件货物依赖性
请参阅Cargo Book中的平台特定依赖项。例如,
Cargo.toml
中的以下行可以满足您的需要(根据您自己的需要调整版本号)。