我正在为Windows开发一个应用程序(目标是:i686-pc-windows-msvc
),这个应用程序有特殊的要求:它使用一个build.rs
文件来指定Windows list .
编译在Windows上运行得很好,但我不得不在这个项目中切换到Linux.
这个项目是这样的:
❯ tree
.
├── build.rs
├── Cargo.lock
├── Cargo.toml
├── Dockerfile
├── src
│ ├── api.rs
│ ├── client.rs
│ ├── main.rs
│ ├── service.rs
│ └── system.rs
└── target
Cargo.toml
个
[package]
name = "wrapper"
version = "0.1.0"
edition = "2021"
build = "build.rs"
[build-dependencies]
winresource = "0.1"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
named-lock = "0.3.0"
rand = "0.8.5"
reqwest = "0.11.24"
tokio = { version = "1.36.0", features = ["rt", "rt-multi-thread"] }
winapi = { version = "0.3.9", features = ["processthreadsapi", "securitybaseapi", "winnt", "fileapi", "minwinbase", "iphlpapi", "winsock2", "ws2def"] }
windows-service = "0.6.0"
build.rs
extern crate winresource;
fn main() {
let mut res = winresource::WindowsResource::new();
res.set_manifest(
r#"
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
"#,
);
res.set_ar_path("i686-w64-mingw32-gcc-ar");
res.set_windres_path("i686-w64-mingw32-windres");
if let Err(error) = res.compile() {
eprint!("{error}");
std::process::exit(1);
}
}
因此,我try 通过Dockerfile将编译过程包装起来,但没有成功.
以下是我的Dockerfile:
FROM archlinux:multilib-devel-20240101.0.204074
RUN pacman -Syu --noconfirm && \
pacman -S --needed --noconfirm rustup mingw-w64
RUN rustup default stable && \
rustup target install i686-pc-windows-msvc
WORKDIR /app
COPY Cargo.toml Cargo.lock build.rs ./
COPY src ./src
RUN cargo build --target i686-pc-windows-msvc
RUN cargo build --release --target i686-pc-windows-msvc
RUN mkdir -p /app/debug/ && \
cp target/i686-pc-windows-msvc/debug/wrapper.exe /app/debug/
RUN mkdir -p /app/release/ && \
cp target/i686-pc-windows-msvc/release/wrapper.exe /app/release/
以下是我的输出:
❯ docker build --tag 'wrapper' .
[...]
Step 7/10 : RUN cargo build --target i686-pc-windows-msvc
[...]
Compiling wrapper v0.1.0 (/app)
The following warnings were emitted during compilation:
warning: wrapper@0.1.0: unknown Windows target used for cross-compilation; invoking unprefixed windres
error: failed to run custom build command for `wrapper v0.1.0 (/app)`
Caused by:
process didn't exit successfully: `/app/target/debug/build/wrapper-6dacece8a0e1e7d8/build-script-build` (exit status: 1)
--- stdout
package.metadata does not exist
cargo:warning=unknown Windows target used for cross-compilation; invoking unprefixed windres
Selected RC path: '/bin\x64\rc.exe'
--- stderr
No such file or directory (os error 2)
warning: build failed, waiting for other jobs to finish...
The command '/bin/sh -c cargo build --target i686-pc-windows-msvc' returned a non-zero code: 101
如何让我的Dockerfile
正确编译并返回程序的两个版本(debug
和release
)?