如果它是两个目录,我如何引用Maven中的本地Mercurial存储库?

时间:2013-03-07 23:29:24

标签: maven mercurial

我们一直在POM文件中使用SCM URL,如下所示:

<scm>
    <connection>scm:hg:file:///${basedir}</connection>
    <developerConnection>scm:hg:file:///${basedir}</developerConnection>
</scm>

它要求我们使用“mvn release:prepare -DpushChanges = false”启动发布过程,但我们不得不这样做(hg插件不能正确处理身份验证)。对我们来说最重要的是,如果发布过程在任何时候出错,我们都可以“hg strip” - 除了本地开发人员之外,没有人能够看到它。

如果我们在Mercurial结帐中有一个目录,则同样的过程也有效。在这种情况下,以下URL可以解决这个问题:

<scm>
    <connection>scm:hg:file:///${basedir}/..</connection>
    <developerConnection>scm:hg:file:///${basedir}/..</developerConnection>
    <tag>HEAD</tag>
</scm>

但是:当那里有另一个级别时,一切都会出错。我尝试过多种文件URL变体,但它们似乎都失败了。

使用“scm:hg:file:/// $ {basedir} /../ ..”的天真方法会导致网站插件和发布插件都失败。前者会告诉我这个:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.2:site (default-site) on project epik-protocol-spec: Execution default-site of goal org.apache.maven.plugins:maven-site-plugin:3.2:site failed: This SCM url 'scm:hg:file:///../epik-protocol-spec' is invalid due to the following errors:
[ERROR] * An hg 'file' url must be on the form 'file:///' or 'file://localhost/'.
[ERROR] For more information about SCM URL Format, please refer to: http://maven.apache.org/scm/scm-url-format.html

('epik-protocol-spec'是正在运行的构建中的模块的名称)

发布插件遇到类似问题:发布后:准备release.properties文件将scm.url设置为“file:/// ..”,然后将无法获取标记的副本发布期间的代码:执行。解决方法是在步骤之间手动修复属性。我还没有找到使网站构建工作的方法。

我的目标是:

  • 有一个开箱即用的构建(即从IDE克隆项目并运行任何目标)
  • 能够在构建服务器上生成站点(并运行其他构建)
  • 能够使用发布插件运行发行版,并在推送之前审核所有更改

有没有人可以解决这个问题?为什么URL被严重破坏 - 方法不好还是我们遇到了Maven问题?

修改

正如Charlee所提出的,我检查了mvn help:effective-pom的输出。 SCM URL被破坏了。它还显示Maven将模块名称附加到URL,这意味着有必要在每个模块上定义URL - 假设可以停止奇怪的修改。

这样的自定义属性:

<properties>
    <test.property>scm:hg:file:///${basedir}/../..</test.property>
</properties>

不会被破坏,它会按预期得到解决(也使用有效的POM进行检查)。

2 个答案:

答案 0 :(得分:1)

Maven SCM提供商正在根据“../”和“.. \”匹配方案缩短网址。如果其中一个字符序列匹配,它将向后搜索匹配的斜杠(超过之前的斜杠),将所有内容删除回原点。此规则意味着我的文件URL,如下所示:

scm:hg:file:///C:\some\local\path/../..

会因“../”序列而触发缩短,然后会删除回到之前的 forward 斜杠,这意味着回到“C:”之前的斜杠,从而删除整条道路。

如果点后面没有斜线,则不会触发此行为,因此我的URL末尾的步骤没有造成任何伤害 - 这就解释了为什么我上升到一个级别没有问题。

解决方案(解决方法?)是使用它:

scm:hg:file:///${basedir}${file.separator}..${file.separator}..

然后,无论操作系统如何,URL缩短都会遇到匹配的斜杠,并且它会再次开始工作。

答案 1 :(得分:0)

关于SCM Implementation: Mercurial,它在示例中提到如下: -

scm:hg:http://host/v3
scm:hg:file://C:/dev/project/v3 (windows drive) 
              <--- only 2 slashes + [os, e.g. drive:/path/...]
scm:hg:file:///home/smorgrav/dev/project/v3 (linux drive) 
              <--- only 2 slashes + [os, e.g. /home/...]
scm:hg:/home/smorgrav/dev/project/v3 (local directory)
无论如何,Maven告诉我们

This SCM url 'scm:hg:file:///../epik-protocol-spec' 
is invalid due to the following errors

如果我错了,请纠正我。我了解您是在Microsoft Windows环境中,并且可能只使用2个斜杠来满足您的要求。

无论如何,另一个疑似可能是${basedir}被解析为../epik-protocol-spec。如果我理解正确,那应该是一条完整的道路。

我希望这可能有所帮助。