1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
use clap::Parser;
use wasmer_registry::wasmer_env::WasmerEnv;
/// Publish a package to the package registry.
#[derive(Debug, Parser)]
pub struct Publish {
#[clap(flatten)]
env: WasmerEnv,
/// Run the publish logic without sending anything to the registry server
#[clap(long, name = "dry-run")]
pub dry_run: bool,
/// Run the publish command without any output
#[clap(long)]
pub quiet: bool,
/// Override the package of the uploaded package in the wasmer.toml
#[clap(long)]
pub package_name: Option<String>,
/// Override the package version of the uploaded package in the wasmer.toml
#[clap(long)]
pub version: Option<semver::Version>,
/// Skip validation of the uploaded package
#[clap(long)]
pub no_validate: bool,
/// Directory containing the `wasmer.toml`, or a custom *.toml manifest file.
///
/// Defaults to current working directory.
#[clap(name = "PACKAGE_PATH")]
pub package_path: Option<String>,
}
impl Publish {
/// Executes `wasmer publish`
pub fn execute(&self) -> Result<(), anyhow::Error> {
let publish = wasmer_registry::package::builder::Publish {
registry: self.env.registry_endpoint().map(|u| u.to_string()).ok(),
dry_run: self.dry_run,
quiet: self.quiet,
package_name: self.package_name.clone(),
version: self.version.clone(),
token: self.env.token(),
no_validate: self.no_validate,
package_path: self.package_path.clone(),
};
publish.execute().map_err(on_error)?;
if let Err(e) = invalidate_graphql_query_cache(&self.env) {
tracing::warn!(
error = &*e,
"Unable to invalidate the cache used for package version queries",
);
}
Ok(())
}
}
fn on_error(e: anyhow::Error) -> anyhow::Error {
#[cfg(feature = "telemetry")]
sentry::integrations::anyhow::capture_anyhow(&e);
e
}
// HACK: We want to invalidate the cache used for GraphQL queries so
// the current user sees the results of publishing immediately. There
// are cleaner ways to achieve this, but for now we're just going to
// clear out the whole GraphQL query cache.
// See https://github.com/wasmerio/wasmer/pull/3983 for more
fn invalidate_graphql_query_cache(env: &WasmerEnv) -> Result<(), anyhow::Error> {
let cache_dir = env.cache_dir().join("queries");
std::fs::remove_dir_all(cache_dir)?;
Ok(())
}