1
votes

We have numerous ant-based projects which depend on a single ivysettings.xml where our ivy resolvers are defined. I'm creating a new sbt-based project, and according to the DRY principle, I'd like for sbt to also depend on this same ivysettings.xml file (rather than attempting to re-defining the resolvers within the sbt script). This turned out to be really easy, using externalIvySettings() -- at least, for resolving dependencies.

However, we also need to publish to one of the resolvers defined in the file. In ant, this is really easy: <ivy:publish resolver="..." />", however with sbt I'm stumped. Sbt has a publishTo setting which can be used to define a resolver to publish to, but I don't want to define a new resolver. Instead, I want to pull a resolver out of the settings loaded by externalIvySettings(), and pass this to publishTo. Is this possible?

Edit:

Here is the ivysettings.xml file as requested. We want to publish to the "modules" resolver.

<ivysettings>

  <properties file="${ivy.settings.dir}/ivysettings.properties" />

  <settings defaultResolver="default" defaultResolveMode="dynamic"/>

  <property name="x1.resolver"           value="x1-fs" override="false"/>
  <property name="x2.resolver"           value="x2-fs" override="false"/>

  <property name="x1.ivy.pattern"        value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="true"/>
  <property name="x1.artifact.pattern"   value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="true"/>

  <property name="x2.ivy.pattern"        value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="true"/>
  <property name="x2.artifact.pattern"   value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="true"/>

  <property name="local.root"             value="${ivy.default.ivy.user.dir}/x1-local" override="true"/>
  <property name="local.ivy.pattern"      value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="true"/>
  <property name="local.artifact.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="true"/>

  <property name="modules.root"             value="${ivy.settings.dir}/ivy/published" override="true"/>
  <property name="modules.ivy.pattern"      value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="true"/>
  <property name="modules.artifact.pattern" value="[organisation]/[module]/[revision]/[type]s/[artifact].[ext]" override="true"/>

  <!-- some default values for paths to the x2 and x1 repositories; these should be overridden in ivysettings.properties -->
  <property name="x2.fs.root" value="${ivy.settings.dir}/ivy/x2root" override="false"/>
  <property name="x1.fs.root" value="${ivy.settings.dir}/ivy/x1root" override="false"/>

  <property name="ivy.cache.dir" value="${ivy.settings.dir}/ivy/cache"/>

  <caches defaultCacheDir="${ivy.cache.dir}"/>

  <resolvers>
    <filesystem name="x1-fs">
      <ivy pattern="${x1.fs.root}/${x1.ivy.pattern}" />
      <artifact pattern="${x1.fs.root}/${x1.artifact.pattern}" />
    </filesystem>

    <filesystem name="x2-fs">
      <ivy pattern="${x2.fs.root}/${x2.ivy.pattern}" />
      <artifact pattern="${x2.fs.root}/${x2.artifact.pattern}" />
    </filesystem>

    <chain name="x1">
     <resolver ref="${x1.resolver}"/>
    </chain>

    <chain name="x2">
     <resolver ref="${x2.resolver}"/>
    </chain>

    <filesystem name="local">
      <ivy pattern="${local.root}/${local.ivy.pattern}" />
      <artifact pattern="${local.root}/${local.artifact.pattern}" />
    </filesystem>

    <filesystem name="modules" checkmodified="true" changingPattern="*" changingMatcher="glob">
      <ivy pattern="${modules.root}/${modules.ivy.pattern}" />
      <artifact pattern="${modules.root}/${modules.artifact.pattern}" />
    </filesystem>

    <chain name="main" dual="true">
      <resolver ref="modules"/>
      <resolver ref="x1"/>
      <resolver ref="x2"/>
    </chain>

    <chain name="default" returnFirst="true">
      <resolver ref="local"/>
      <resolver ref="main"/>
    </chain>

  </resolvers>

</ivysettings>
1
Can you show the xml definition of the publishing resolver? - laughedelic

1 Answers

0
votes

found the answer in this link https://github.com/sbt/sbt/issues/1999

But the answer is to just reference the resolver by name. In your situation it would be

publishTo := Some(Resolver.file("modules"))

since you want to publish using the "modules" resolver