Awesome feedback! Let's skype on it today. On Wed, Sep 24, 2014 at 5:50 PM, Daz DeBoer <darrell.deb...@gradleware.com> wrote: > Thanks Szczepan! > > I've finally found the time to get fully across this feature. I haven't yet > looked into the implementation. > > Here's some initial feedback on the model. > > 1. We've named this feature 'component replacements', but the modelling is > done at the "module" level (ComponentModuleMetadata). I don't think this is > ideal: I'd like to think about a 'replacement' being modelled at the > component level ("org:name:version" instead of "org:name"). In most cases > we'll consider all components with the same 'org:name as having the same > replacements, and the DSL would make it convenient to define this. But the > underlying model should associate 'replacements' with a component, I think. > 2. Eventually, we'd like a published component to contain replacement > information. For this to be convenient, we'd normally publish a component > and say it 'replaces' or 'supercedes' a set of other components. I think it > might be helpful to model the relationship in this way, using 'replaces' > rather than 'replaced by'. > > And on the DSL: > The DSLs for all of our 'rules' that apply to dependency resolution are > converging on a pattern that will hopefully allow them to be migrated into > the new configuration rule infrastructure at some stage. The pattern is: > > model-rule-type { > eachXXX { SomeMutableType mutable[, OtherType immutableInput]* -> > } > module("group:name") { SomeMutableType mutable[, OtherType > immutableInput]* -> > } > } > > Exceptions: > - For component selection rules, 'all' is used instead of > 'eachComponentSelection'. > - I'm thinking this works better as a partner method to 'module()' > - For component metadata rules, the module() method doesn't exist yet. > - For dependency resolve rules, the 'model-rule-type' containing element > doesn't exist. > > If we stick with the same pattern for component replacements, we'd have: > > dependencies { > components { > module("com.google.guava:guava") { ComponentSubstitutionDetails > component -> > > component.replacesModule("com.google.collections:google-collections") > } > } > } > > That's it for now. Thanks for restarting the discussion! > Daz > > On Wed, Sep 24, 2014 at 3:31 AM, Szczepan Faber <szcze...@gmail.com> wrote: >> >> Upcoming Gradle 2.2 contains new incubating component replacement rules: >> >> dependencies { >> components { >> >> module("com.google.collections:google-collections").replacedBy("com.google.guava:guava") >> } >> } >> >> See more in http://www.gradle.org/docs/nightly/release-notes. This >> declaration is used during conflict resolution, Gradle will prevent >> both collections and guava appear in the same dependency tree, >> preferring any version of guava over every version of collections. >> Most importantly, if the dependency tree _only_ contains collections >> it will _not_ be replaced (because there is no conflict). Multiple >> modules can have the same target replacement. However, we don't >> support (yet) having single module replaced by multiple modules. >> >> The full DSL in the current form, based on our previous discussion on >> the mailing list. I'm starting new email thread on purpose (for good >> or bad, let's see whether it helps). >> >> dependencies { >> components { >> //declaring replacement: >> >> module("com.google.collections:google-collections").replacedBy("com.google.guava:guava") >> module(someModuleIdentifier).replacedBy("com.google.guava:guava") >> >> //querying for the replacement target: >> ModuleIdentifier id = >> module("com.google.collections:google-collections").getReplacedBy() >> >> //querying for the replacement source: >> ModuleIdentifier id = >> module("com.google.collections:google-collections").getId() >> } >> } >> >> Javadoc (for interface names, etc.): >> >> http://www.gradle.org/docs/nightly/javadoc/org/gradle/api/artifacts/dsl/ComponentMetadataHandler.html#module(java.lang.Object) >> >> This DSL can grow to accommodate features like: >> a) replacing single module with a set of modules. I'd love to have >> this. I also want to make incremental progress. >> b) other component module metadata (e.g. releasable units, impl module >> consistent with api module). I'd love to have this, too. >> >> Let's confirm this API and/or make changes to it before 2.2 release. >> Other related APIs that we should have in mind (for consistency): >> >> 1. component selection rules: >> >> configurations.conf.resolutionStrategy { >> componentSelection { >> all { ComponentSelection selection -> >> if (selection.candidate.group == 'org.sample') { >> selection.reject("rejecting experimental") >> } >> } >> module("org.sample:api") { ComponentSelection selection -> >> if (selection.candidate.version == "1.1") { >> selection.reject("known bad version") >> } >> } >> } >> } >> >> 2. component metadata rules: >> >> dependencies { >> components { >> eachComponent { ComponentMetadataDetails details, >> IvyModuleDescriptor ivyModule -> >> if (details.id.group == 'my.org' && ivyModule.branch == >> 'testing') { >> details.changing = true >> } >> } >> } >> } >> >> Cheers! >> -- >> Szczepan Faber >> Core dev@gradle; Founder@mockito >> >> --------------------------------------------------------------------- >> To unsubscribe from this list, please visit: >> >> http://xircles.codehaus.org/manage_email >> >> > > > > -- > Darrell (Daz) DeBoer > http://www.gradleware.com
-- Szczepan Faber Core dev@gradle; Founder@mockito --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email