diff --git a/source/dub/dependency.d b/source/dub/dependency.d index 2bacedf..e316fde 100644 --- a/source/dub/dependency.d +++ b/source/dub/dependency.d @@ -478,7 +478,7 @@ RequestedDependency[string] missing() const { RequestedDependency[string] deps; forAllDependencies( (const PkgType* avail, string pkgId, const Dependency d, const Package issuer) { - if(!d.optional || !avail || !d.matches(avail.vers)) + if(!d.optional && (!avail || !d.matches(avail.vers))) addDependency(deps, pkgId, d, issuer); }); return deps; @@ -492,6 +492,17 @@ }); return deps; } + + RequestedDependency[string] optional() const { + RequestedDependency[string] allDeps; + forAllDependencies( (const PkgType* avail, string pkgId, const Dependency d, const Package issuer) { + addDependency(allDeps, pkgId, d, issuer); + }); + RequestedDependency[string] optionalDeps; + foreach(id, req; allDeps) + if(req.dependency) optionalDeps[id] = req; + return optionalDeps; + } private void forAllDependencies(void delegate (const PkgType* avail, string pkgId, const Dependency d, const Package issuer) dg) const { foreach(string issuerPackag, issuer; m_packages) { diff --git a/source/dub/project.d b/source/dub/project.d index 70aa854..bc9fb07 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -430,7 +430,14 @@ oldMissing = missing.dup; logTrace("There are %s packages missing.", missing.length); - foreach(string pkg, reqDep; missing) { + + auto toLookup = missing; + foreach(id, dep; graph.optional()) { + enforce(id !in toLookup, "A missing dependency in the graph seems to be optional, which is an error."); + toLookup[id] = dep; + } + + foreach(string pkg, reqDep; toLookup) { if(!reqDep.dependency.valid()) { logTrace("Dependency to "~pkg~" is invalid. Trying to fix by modifying others."); continue; @@ -447,7 +454,7 @@ p = null; } - if( !p ){ + if( !reqDep.dependency.optional && !p ){ try { logDebug("using package from registry"); foreach(ps; packageSuppliers){