0

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

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

它要求我们使用“mvn release:prepare -DpushChanges=false”开始发布过程,但无论如何我们都必须这样做(hg 插件无法正确处理身份验证)。对我们来说最大的好处是,如果发布过程在任何时候出错,我们都可以“剥离”——除了本地开发人员之外,没有人会看到这一点。

如果我们在 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 检查)。

4

2 回答 2

1

Maven SCM 提供程序正在缩短基于“../”和“..\”匹配方案的 URL。如果这些字符序列中的一个匹配,它将向后搜索匹配的斜杠(过去的斜杠),将所有内容删除。这条规则意味着我的文件 URL,看起来像这样:

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

由于“../”序列会触发缩短,然后它将删除回到上一个斜杠,这意味着回到“C:”之前的斜杠,从而删除整个路径。

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

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

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

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

于 2013-03-11T06:10:30.380 回答
0

关于SCM 实施: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。如果我理解正确,它应该是一个完整的路径。

我希望这可能会有所帮助。

于 2013-03-08T01:51:05.060 回答