我正在用两个不同的命令行构建相同的Cargo.toml。这是用于构建NEAR协议智能合约的。
首次使用--manifest-path
cargo build --manifest-path contract/Cargo.toml --release --target wasm32-unknown-unknown
...
Finished release [optimized] target(s) in 23.25s
ls -lha contract/target/wasm32-unknown-unknown/release
...
-rwxr-xr-x 2 moo staff 1.7M Oct 5 12:32 nep9000_pool.wasm*
-rwxr-xr-x 2 moo staff 1.8M Oct 5 12:32 nep9000_token.wasm*
二进制文件的大小为1.8兆字节。
然后我从Cargo.toml
所在的文件夹中执行货物构建。
cd contract
cargo build --release --target wasm32-unknown-unknown
Finished release [optimized] target(s) in 22.85s
ls -lha target/wasm32-unknown-unknown/release
-rwxr-xr-x 2 moo staff 127K Oct 5 12:35 nep9000_pool.wasm*
-rw-r--r-- 1 moo staff 305 Sep 30 21:09 nep9000_token.d
-rwxr-xr-x 2 moo staff 189K Oct 5 12:35 nep9000_token.wasm*
在后一种方法中,二进制大小要小10倍。
为什么会这样?上面的cargo
命令有何不同?
我假设第二个构建获取编译标志-C link-arg=-s
,而第一个没有。编译标志可以通过多种方式传递:作为env变量或作为.forge/config的一部分。首先要弄清楚为什么cargo忽略了它,可能会让人筋疲力尽,我只建议始终将其编译为RUSTFLAGS="-C link-arg=-s" cargo build --release --target wasm32-unknown-unknown