@@ -782,13 +782,21 @@ getTransitiveDeps workspacePackage = do
782782getTransitiveDepsFromRegistry :: forall a . Map PackageName Range -> PackageMap -> Spago (FetchEnv a ) (Map PackageName Version )
783783getTransitiveDepsFromRegistry depsRanges extraPackages = do
784784 let
785+ -- Widen ranges for non-registry extra packages (local/git/workspace overrides).
786+ widenIfExtra :: Map PackageName Range -> Map PackageName Range
787+ widenIfExtra = mapWithIndex \name range ->
788+ case Map .lookup name extraPackages of
789+ Just (RegistryVersion _) -> range
790+ Just _ -> Config .widestRange
791+ Nothing -> range
792+
785793 loader :: PackageName -> Spago (FetchEnv a ) (Map Version (Map PackageName Range ))
786794 loader packageName = do
787795 -- First look up in the extra packages, as they are the workspace ones, and overrides
788796 case Map .lookup packageName extraPackages of
789797 Just p -> do
790798 deps <- getPackageDependencies packageName p
791- let coreDeps = deps <#> _.core # fromMaybe Map .empty
799+ let coreDeps = widenIfExtra $ deps <#> _.core # fromMaybe Map .empty
792800 pure $ Map .singleton (getVersionFromPackage p) coreDeps
793801 Nothing -> do
794802 maybeMetadata <- Registry .getMetadata packageName
@@ -798,10 +806,26 @@ getTransitiveDepsFromRegistry depsRanges extraPackages = do
798806 Left _err -> []
799807 map (Map .fromFoldable :: Array _ -> Map _ _ ) $ for versions \v -> do
800808 maybeManifest <- Registry .getManifestFromIndex packageName v
801- let deps = fromMaybe Map .empty $ map (_.dependencies <<< unwrap) maybeManifest
809+ let deps = widenIfExtra $ fromMaybe Map .empty $ map (_.dependencies <<< unwrap) maybeManifest
802810 pure (Tuple v deps)
803811
804- maybePlan <- Registry.Solver .loadAndSolve loader depsRanges
812+ -- Warn when a non-registry extra package's version doesn't match the declared constraint
813+ for_ (Map .toUnfoldable (Map .intersectionWith Tuple depsRanges extraPackages) :: Array _ )
814+ \(Tuple name (Tuple range pkg)) -> case pkg of
815+ RegistryVersion _ -> pure unit
816+ _ -> do
817+ maybeVersion <- extraPackageVersion pkg
818+ case maybeVersion of
819+ Just version | not (Range .includes range version) ->
820+ logWarn $ " Extra package " <> PackageName .print name <> " has version "
821+ <> Version .print version
822+ <> " , which doesn't satisfy constraint "
823+ <> Range .print range
824+ _ -> pure unit
825+
826+ let widenedDepsRanges = widenIfExtra depsRanges
827+
828+ maybePlan <- Registry.Solver .loadAndSolve loader widenedDepsRanges
805829
806830 case maybePlan of
807831 Left errs -> die
@@ -901,6 +925,19 @@ getVersionFromPackage = case _ of
901925 RegistryVersion v -> v
902926 _ -> unsafeFromRight $ Version .parse " 0.0.0"
903927
928+ -- | Extract the version from a non-registry package's config if available.
929+ extraPackageVersion :: forall a . Package -> Spago (FetchEnv a ) (Maybe Version )
930+ extraPackageVersion = case _ of
931+ RegistryVersion v -> pure $ Just v
932+ WorkspacePackage wp -> pure $ wp.package.publish <#> _.version
933+ LocalPackage p -> do
934+ result <- Config .readConfig (Path .global p.path </> " spago.yaml" )
935+ pure $ case result of
936+ Right { yaml: { package: Just { publish: Just { version } } } } -> Just version
937+ _ -> Nothing
938+ -- Git packages would require cloning to read their config, so no version warning is possible.
939+ GitPackage _ -> pure Nothing
940+
904941notInPackageSetError :: PackageName -> TransitiveDepsResult -> TransitiveDepsResult
905942notInPackageSetError dep result = result
906943 { errors { notInPackageSet = Set .insert dep result.errors.notInPackageSet } }
0 commit comments