47 个版本
使用旧的 Rust 2015
0.6.26 | 2019年7月15日 |
---|---|
0.6.24 | 2019年4月14日 |
0.6.23 | 2018年12月15日 |
0.6.21 | 2018年11月22日 |
0.1.1 | 2017年3月8日 |
在 Cargo 插件 中排名第 228
每月下载量 156 次
被 2 个crate 使用
335KB
8K SLoC
A cargo 子命令,用于客户端 Web
此 cargo 子命令旨在使使用 Rust 编写的客户端 Web 应用程序的构建、开发和部署变得简单方便。
捐赠
赞助者
这些美好的人们使这款软件得以问世
- Embark Studios
- Joe Narvaez
- Eduard Knyshov
- Anselm Eickhoff
- Johan Andersson
- Stephen Sugden
- is8ac
感谢您!
功能
目前它支持以下功能
cargo web build
- 使用 Rust 的三个 Web 后端之一构建您的项目- WebAssembly 使用 Rust 的原生 WebAssembly 后端(当传递
--target=wasm32-unknown-unknown
;默认值) - WebAssembly 使用 Emscripten(当传递
--target=wasm32-unknown-emscripten
) - asm.js 使用 Emscripten(当传递
--target=asmjs-unknown-emscripten
)
- WebAssembly 使用 Rust 的原生 WebAssembly 后端(当传递
cargo web check
- 将对您的项目进行类型检查cargo web test
- 将在以下环境中运行您的测试- 在无头 Google Chrome 实例下(默认)
- 在 Node.js 下(当传递
--nodejs
)
cargo web start
- 将构建您的项目,启动嵌入式Web服务器,并在必要时持续重新构建;支持使用--auto-reload
进行自动重新加载。cargo web deploy
- 将构建您的项目并输出所有必要的文件,以便您可以轻松地以静态方式提供它们。- 将在以下平台上自动下载和安装Emscripten(如果需要):
- Linux x86-64
- Linux x86
- 将通过
rustup
自动为您安装相关的Rust目标。
如果您想在项目中与JavaScript世界交互,强烈建议您查看stdweb crate。(实际上,是cargo-web
使得在Rust的原生WebAssembly后端上使用stdweb
的js!
宏成为可能。)
安装
$ cargo install cargo-web
要升级
$ cargo install --force cargo-web
或者使用$ cargo build --release
进行克隆和构建,然后将其放置在您的$PATH中。
在Linux上,安装可能会失败,显示找不到OpenSSL的错误消息,在这种情况下,您可能需要从您的发行版的存储库中安装OpenSSL的-dev
包。(在Ubuntu上称为libssl-dev
。)
Web.toml
cargo-web
有自己的配置文件,您可以将其放在cargo
的Cargo.toml
旁边。
以下是一个配置示例,展示了所有支持的关键字
# The default value of `--target` used when building this crate
# in cases where it's not specified on the command line.
default-target = "wasm32-unknown-unknown"
# This will prepend a given JavaScript file to the resulting `.js` artifact.
# You can put any initialization code here which you'd like to have executed
# when your `.js` file first loads.
#
# This accepts either a string (as shown here), or an array of strings,
# in which case it will prepend all of the specified files in their
# order of appearance.
prepend-js = "src/runtime.js"
[cargo-web]
# Asserts the minimum required version of `cargo-web` necessary
# to compile this crate; supported since 0.6.0.
minimum-version = "0.6.0"
# These will only take effect on *-emscripten targets.
[target.emscripten]
# You can have a target-specific `prepend-js` key.
prepend-js = "src/emscripten_runtime.js"
# This will enable Emscripten's SDL2 port. Consult Emscripten's documentation
# for more details.
link-args = ["-s", "USE_SDL=2"]
# You can also specify the target by its full name.
[target.wasm32-unknown-unknown]
prepend-js = "src/native_runtime.js"
如果您使用任何具有Web.toml
的外部crate,则cargo-web
会加载并使用它。
关于Web.toml
的一些限制
- 您不能有重叠的
prepend-js
密钥。您可以定义单个全局prepend-js
,或者为每个目标定义多个。 - 当前的
link-args
中不能包含任何空格。 cargo-web
处理来自多个crate的Web.toml
文件的顺序是确定性的但未指定。这意味着您不应该以任何方式依赖于此顺序。
静态文件
您想在运行cargo web start
或部署时运行cargo web deploy
时要提供的任何静态文件都可以放在crate根目录下的static
目录中。默认情况下不需要静态工件;如果缺少,将自动为您生成一个index.html
文件。当然,您也可以放置自己的static/index.html
文件,在这种情况下,将使用它而不是自动生成的文件。
在编译期间检测cargo-web
如果在编译期间您想检测您的项目是用cargo-web
构建的,您可以通过检查COMPILING_UNDER_CARGO_WEB
环境变量来做到这一点,该变量将被设置为1
。
在Travis上使用 cargo-web
预编译的二进制文件
您可以使用以下脚本下载并安装最新的 cargo-web
CARGO_WEB_RELEASE=$(curl -L -s -H 'Accept: application/json' https://github.com/koute/cargo-web/releases/latest)
CARGO_WEB_VERSION=$(echo $CARGO_WEB_RELEASE | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/')
if [ "$(uname -s)" == "Darwin" ]; then
CARGO_WEB_HOST_TRIPLE="x86_64-apple-darwin"
else
CARGO_WEB_HOST_TRIPLE="x86_64-unknown-linux-gnu"
fi
CARGO_WEB_URL="https://github.com/koute/cargo-web/releases/download/$CARGO_WEB_VERSION/cargo-web-$CARGO_WEB_HOST_TRIPLE.gz"
echo "Downloading cargo-web from: $CARGO_WEB_URL"
curl -L $CARGO_WEB_URL | gzip -d > cargo-web
chmod +x cargo-web
mkdir -p ~/.cargo/bin
mv cargo-web ~/.cargo/bin
在无头Chrome下运行测试
默认情况下,cargo web test
将在无头Chrome下运行您的测试。要在Travis上使用此功能,您需要将以下内容添加到您的 .travis.yml
addons:
chrome: stable
自定义运行时(仅限 wasm32-unknown-unknown
)
默认情况下,cargo-web
为您生成一个独立的运行时。这意味着生成的 .js
文件可以直接放入 <script>
标签中,或使用Node.js启动,无需手动加载或执行任何额外操作,但这确实限制了您的可定制性。
如果您想对模块的加载方式有更多控制,可以使用 --runtime library-es6
选项告诉 cargo-web
为您生成一个非独立、类似库的模块。这将生成一个 .js
文件,该文件导出一个具有以下接口的工厂函数
export default function() {
return {
imports: { ... },
initialize: function( instance ) { ... }
};
}
在这里,您需要自行实例化WebAssembly模块;在这种情况下,您需要传递 imports
作为其导入,然后立即在实例化后调用 initialize
。
例如,假设您将 cargo-web
生成的模块命名为 my-module.mjs
和 my-module.wasm
,您可以从Node.js像这样实例化它
import fs from "fs";
import factory from "my-module.mjs";
// We read in the `.wasm` module.
const bytecode = fs.readFileSync( "my-module.wasm" );
const wasm = new WebAssembly.Module( bytecode );
// We instantiate it.
const instance = factory();
const compiled = new WebAssembly.Instance( wasm, instance.imports );
// This will initialize the module and call your `main`, if you have one.
const exports = instance.initialize( compiled );
// In the object it returns you can find any functions which
// you've exported with `stdweb`'s `#[js_export]` macro.
console.log( exports.add( 1, 2 ) );
然后您可以使用 node --experimental-modules run.mjs
运行它。
如果您想从自定义URL加载您的 .wasm
文件,或者您想将输出与JavaScript打包器集成,或者任何需要您自行加载模块的其他情况,这很有用。
变更日志
0.6.26
- 已修复
--no-default-features
标志 - 嵌入式Web服务器现在使用
mime-guess
包来猜测MIME类型
- 已修复
0.6.25
cargo web start
现在将尝试在项目文件连续修改时避免触发不必要的重建- 已更新到最新版本的嵌入式OpenSSL副本
0.6.24
- 现在正确支持形式为
[target.'cfg(...)'.dependencies]
的条件依赖 - 现在您可以使用
cfg(cargo_web)
来检测您的crate是否正在cargo-web
下编译 - 现在忽略与
target/wasm32-unknown-unknown/*/deps/*.wasm
匹配的工件;这应该可以防止cargo-web
处理由于依赖项也是cdylib
而产生的多余.wasm
工件 cargo-web
现在可以通过基于structopt
的接口作为库使用
- 现在正确支持形式为
0.6.23
- 新增子命令:
cargo web check
wasm32-unknown-unknown
现在是默认目标
- 新增子命令:
0.6.22
- 在 macOS 上通过 Chrome 运行测试现在应该能够直接工作
deploy
子命令现在可以使用-o
/--output
参数指定部署位置- 现在可以正确地提供名称中包含空格的静态文件
Access-Control-Allow-Origin: *
现在总是由嵌入式网络服务器发送- 如果使用了足够新的
stdweb
,现在支持在wasm32-unknown-unknown
上进行调试构建
0.6.21
- Emscripten 已更新到
1.38.19
;基于 Emscripten 的目标现在应该可以在夜间版本上再次工作 - 测试运行器中的输出重定向问题现在已修复
- 现在对
wasm32-unknown-unknown
下的生成的 JS 片段和导入进行了排序 - 删除了对
wasm32-unknown-unknown
的非常旧的夜间版本的兼容性
- Emscripten 已更新到
0.6.20
- 通过
cargo install
的安装现在应该可以再次工作 - 大多数依赖项都已更新到新版本
deploy
在找不到有效目标时现在不会恐慌
- 通过
0.6.19
cargo install
现在应该可以在某些环境中编译而不是失败- 最低要求的 Rust 版本是现在
1.26.2
0.6.18
- 默认的
index.html
现在在其 doctype 前不再有换行符了
- 默认的
0.6.17
- 现在以供应商的形式提供了 OpenSSL;这应该可以解决某些环境中的编译问题
- 最低要求的 Rust 版本是现在
1.25.0
0.6.16
- 现在当可用时,
wasm32-unknown-unknown
的运行时使用WebAssembly.instantiateStreaming
- 现在支持在无头 Chromium 下为
wasm32-unknown-unknown
目标运行测试 - 当
cargo-web
的输出被重定向时不再发出颜色代码 - 改进了着色;现在应该有更多消息被着色
- 最初实验性地支持异步测试
- 现在当可用时,
许可证
许可为以下之一
- Apache 许可证 2.0 版,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- 麻省理工学院许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,任何有意提交以包含在作品中的贡献,都将按上述方式双许可,不附加任何额外条款或条件。
依赖关系
~28–41MB
~738K SLoC