feat: add dev flag

This commit is contained in:
Stefanuk12 2025-04-19 23:49:19 +01:00
parent 15ca642a19
commit e70c8ebc01
No known key found for this signature in database
GPG key ID: 7E19B1E4C83A2A35
6 changed files with 54 additions and 21 deletions

View file

@ -110,6 +110,7 @@ Installs dependencies for the current project.
- `--locked`: Whether to error if the lockfile is out of date.
- `--prod`: Whether to not linking dev dependencies.
- `--dev`: Whether to only link dev dependencies.
- `--network-concurrency <CONCURRENCY>`: The number of concurrent network
requests to make at most. Defaults to 16.
- `--force`: Whether to force reinstall all packages even if they are already

View file

@ -9,7 +9,7 @@ use console::style;
use fs_err::tokio as fs;
use indicatif::MultiProgress;
use pesde::{
download_and_link::DownloadAndLinkOptions,
download_and_link::{DownloadAndLinkOptions, InstallDependenciesMode},
linking::generator::generate_bin_linking_module,
manifest::target::TargetKind,
names::{PackageName, PackageNames},
@ -178,7 +178,7 @@ impl ExecuteCommand {
DownloadAndLinkOptions::<CliReporter<Stderr>, ()>::new(reqwest)
.reporter(reporter)
.refreshed_sources(refreshed_sources)
.prod(true),
.install_dependencies_mode(InstallDependenciesMode::Prod),
)
.await
.context("failed to download and link dependencies")?;

View file

@ -3,7 +3,7 @@ use crate::cli::{
run_on_workspace_members,
};
use clap::Args;
use pesde::Project;
use pesde::{download_and_link::InstallDependenciesMode, Project};
use std::num::NonZeroUsize;
#[derive(Debug, Args, Copy, Clone)]
@ -16,6 +16,10 @@ pub struct InstallCommand {
#[arg(long)]
prod: bool,
/// Whether to only install dev dependencies
#[arg(long)]
dev: bool,
/// The maximum number of concurrent network requests
#[arg(long, default_value = "16")]
network_concurrency: NonZeroUsize,
@ -30,9 +34,16 @@ pub struct InstallCommand {
struct CallbackError(#[from] anyhow::Error);
impl InstallCommand {
pub async fn run(self, project: Project, reqwest: reqwest::Client) -> anyhow::Result<()> {
let install_dependencies_mode = match (self.prod, self.dev) {
(true, true) => anyhow::bail!("cannot have both prod and dev flags enabled"),
(true, false) => InstallDependenciesMode::Prod,
(false, true) => InstallDependenciesMode::Dev,
(false, false) => InstallDependenciesMode::All,
};
let options = InstallOptions {
locked: self.locked,
prod: self.prod,
install_dependencies_mode,
write: true,
network_concurrency: self.network_concurrency,
use_lockfile: true,

View file

@ -3,7 +3,7 @@ use crate::cli::{
run_on_workspace_members,
};
use clap::Args;
use pesde::Project;
use pesde::{download_and_link::InstallDependenciesMode, Project};
use std::num::NonZeroUsize;
#[derive(Debug, Args, Copy, Clone)]
@ -25,7 +25,7 @@ impl UpdateCommand {
pub async fn run(self, project: Project, reqwest: reqwest::Client) -> anyhow::Result<()> {
let options = InstallOptions {
locked: false,
prod: false,
install_dependencies_mode: InstallDependenciesMode::All,
write: !self.no_install,
network_concurrency: self.network_concurrency,
use_lockfile: false,

View file

@ -10,7 +10,7 @@ use anyhow::Context as _;
use console::style;
use fs_err::tokio as fs;
use pesde::{
download_and_link::{DownloadAndLinkHooks, DownloadAndLinkOptions},
download_and_link::{DownloadAndLinkHooks, DownloadAndLinkOptions, InstallDependenciesMode},
engine::EngineKind,
graph::{DependencyGraph, DependencyGraphWithTarget},
lockfile::Lockfile,
@ -123,7 +123,7 @@ impl DownloadAndLinkHooks for InstallHooks {
#[derive(Debug, Clone, Copy)]
pub struct InstallOptions {
pub locked: bool,
pub prod: bool,
pub install_dependencies_mode: InstallDependenciesMode,
pub write: bool,
pub use_lockfile: bool,
pub network_concurrency: NonZeroUsize,
@ -287,7 +287,7 @@ pub async fn install(
.reporter(reporter)
.hooks(hooks)
.refreshed_sources(refreshed_sources.clone())
.prod(options.prod)
.install_dependencies_mode(options.install_dependencies_mode)
.network_concurrency(options.network_concurrency)
.force(options.force || has_irrecoverable_changes),
)

View file

@ -64,6 +64,18 @@ impl DownloadAndLinkHooks for () {
type Error = Infallible;
}
/// Options for which dependencies to install.
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Default)]
pub enum InstallDependenciesMode {
/// Install all dependencies.
#[default]
All,
/// Install only dependencies, not dev_dependencies.
Prod,
/// Install only dev_dependencies.
Dev,
}
/// Options for downloading and linking.
#[derive(Debug)]
pub struct DownloadAndLinkOptions<Reporter = (), Hooks = ()> {
@ -75,8 +87,8 @@ pub struct DownloadAndLinkOptions<Reporter = (), Hooks = ()> {
pub hooks: Option<Arc<Hooks>>,
/// The refreshed sources.
pub refreshed_sources: RefreshedSources,
/// Whether to skip dev dependencies.
pub prod: bool,
/// Which dependencies to install.
pub install_dependencies_mode: InstallDependenciesMode,
/// The max number of concurrent network requests.
pub network_concurrency: NonZeroUsize,
/// Whether to re-install all dependencies even if they are already installed
@ -96,7 +108,7 @@ where
reporter: None,
hooks: None,
refreshed_sources: Default::default(),
prod: false,
install_dependencies_mode: InstallDependenciesMode::All,
network_concurrency: NonZeroUsize::new(16).unwrap(),
force: false,
}
@ -123,10 +135,13 @@ where
self
}
/// Sets whether to skip dev dependencies.
/// Sets which dependencies to install
#[must_use]
pub fn prod(mut self, prod: bool) -> Self {
self.prod = prod;
pub fn install_dependencies_mode(
mut self,
install_dependencies: InstallDependenciesMode,
) -> Self {
self.install_dependencies_mode = install_dependencies;
self
}
@ -152,7 +167,7 @@ impl Clone for DownloadAndLinkOptions {
reporter: self.reporter.clone(),
hooks: self.hooks.clone(),
refreshed_sources: self.refreshed_sources.clone(),
prod: self.prod,
install_dependencies_mode: self.install_dependencies_mode,
network_concurrency: self.network_concurrency,
force: self.force,
}
@ -161,7 +176,7 @@ impl Clone for DownloadAndLinkOptions {
impl Project {
/// Downloads a graph of dependencies and links them in the correct order
#[instrument(skip_all, fields(prod = options.prod), level = "debug")]
#[instrument(skip_all, fields(install_dependencies = debug(options.install_dependencies_mode)), level = "debug")]
pub async fn download_and_link<Reporter, Hooks>(
&self,
graph: &Arc<DependencyGraph>,
@ -176,7 +191,7 @@ impl Project {
reporter,
hooks,
refreshed_sources,
prod,
install_dependencies_mode,
network_concurrency,
force,
} = options;
@ -420,11 +435,17 @@ impl Project {
let mut graph = Arc::into_inner(graph).unwrap();
if prod {
graph.retain(|_, node| node.node.resolved_ty != DependencyType::Dev);
match install_dependencies_mode {
InstallDependenciesMode::All => {}
InstallDependenciesMode::Prod => {
graph.retain(|_, node| node.node.resolved_ty != DependencyType::Dev);
}
InstallDependenciesMode::Dev => {
graph.retain(|_, node| node.node.resolved_ty == DependencyType::Dev);
}
}
if prod || !force {
if install_dependencies_mode != InstallDependenciesMode::All || !force {
self.remove_unused(&graph).await?;
}