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. - `--locked`: Whether to error if the lockfile is out of date.
- `--prod`: Whether to not linking dev dependencies. - `--prod`: Whether to not linking dev dependencies.
- `--dev`: Whether to only link dev dependencies.
- `--network-concurrency <CONCURRENCY>`: The number of concurrent network - `--network-concurrency <CONCURRENCY>`: The number of concurrent network
requests to make at most. Defaults to 16. requests to make at most. Defaults to 16.
- `--force`: Whether to force reinstall all packages even if they are already - `--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 fs_err::tokio as fs;
use indicatif::MultiProgress; use indicatif::MultiProgress;
use pesde::{ use pesde::{
download_and_link::DownloadAndLinkOptions, download_and_link::{DownloadAndLinkOptions, InstallDependenciesMode},
linking::generator::generate_bin_linking_module, linking::generator::generate_bin_linking_module,
manifest::target::TargetKind, manifest::target::TargetKind,
names::{PackageName, PackageNames}, names::{PackageName, PackageNames},
@ -178,7 +178,7 @@ impl ExecuteCommand {
DownloadAndLinkOptions::<CliReporter<Stderr>, ()>::new(reqwest) DownloadAndLinkOptions::<CliReporter<Stderr>, ()>::new(reqwest)
.reporter(reporter) .reporter(reporter)
.refreshed_sources(refreshed_sources) .refreshed_sources(refreshed_sources)
.prod(true), .install_dependencies_mode(InstallDependenciesMode::Prod),
) )
.await .await
.context("failed to download and link dependencies")?; .context("failed to download and link dependencies")?;

View file

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

View file

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

View file

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

View file

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