Maven + Mercurial + Site Deploy问题

时间:2010-09-29 21:50:00

标签: maven-2 mercurial google-code

我正在尝试使用mercurial将我的Maven生成的网站部署到googlecode项目。 当我做的时候

mvn site:deploy

我收到传输错误:org.apache.maven.scm.NoSuchCommandScmException:没有这样的命令'list'。

就像我试图做一个“svn列表”一样,即使我使用的是mercurial。

在我的pom中我有maven旅行车和mercurial设置(我认为正确):

        org.apache.maven.wagon     货车-SCM     1.0-β-6             org.apache.maven.scm     Maven的SCM提供商-HG     1.4       

然后,对于我的网站部署,我有一个单独的mercurial存储库:

   <distributionManagement>
  <site>
   <id>googlecode</id>
   <name>googlecode site</name>
   <url>scm:hg:${project.site.scm}/</url>
  </site>
   </distributionManagement>

在我的settings.xml中,我有:

  <servers>
  <server>
    <id>googlecode</id>
    <username>...</username>
    <password>...</password>
  </server>
  </servers>

3 个答案:

答案 0 :(得分:5)

偶然发现这个问题并认为我会为其他人提供答案,因为有关如何执行此操作的文档很少:

很长一段时间以来,我已成功在使用Mercurial的Google Code存储库中托管我的网站。它运作良好,我的问题很少

首先,您必须转到您的项目,选项卡“管理”,子选项卡“源”并创建一个名为“站点”的新存储库。然后,你必须提交并推送至少一个文件,方便地称为“index.html”到该存储库,因为SCM插件调用的“hg locate”在完全空的存储库上失败。

我在POM中将此部署到http://site.MYREPO.googlecode.com/hg

<build>
    <plugins>
        ...
        <!--Deploy site with Mercurial (Hg)-->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-site-plugin</artifactId>
            <version>3.0-beta-3</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.scm</groupId>
                    <artifactId>maven-scm-api</artifactId>
                    <version>1.5</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.maven.scm</groupId>
                    <artifactId>maven-scm-provider-hg</artifactId>
                    <version>1.5</version>
                </dependency>
            </dependencies>
        </plugin>
        ...
    </plugins>
</build>

<!--
    Distribution
-->
<distributionManagement>
    <!--Site deploy repository-->
    <site>
        <id>MYREPO.googlecode.com</id>
        <url>scm:hg:https://site.MYREPO.googlecode.com/hg</url>
    </site>
</distributionManagement>

然后你必须告诉Maven你的用户名和密码,所以把它添加到你的Maven settings.xml文件中(注意@字符是HTML编码的Mercurial会正常阻塞它)

<settings>
    <servers>
        <server>
            <id>MYREPO.googlecode.com</id>
            <username>MYEMAIL%40gmail.com</username>
            <password>MYPASSWORD</password>
        </server>
    </servers>
</settings>

现在您可以mvn clean site site:deploy访问http://site.MYREPO.googlecode.com/hg/index.html以获取完整的maven网站。

答案 1 :(得分:0)

site:deploy使用scp或文件协议将站点部署到服务器(see here)。我按照正常的ssh行(authorized_keys等)配置它。在pom中有类似的东西:

  <!-- The location for generating the website. -->
  <distributionManagement>
    <site>
      <id>website</id>
      <url>scp://username@server.com/path/to/deploy/directory/</url>
    </site>
  </distributionManagement>

它从目标/站点目录中获取所有内容,并将其复制到定义的目标。但是,缺点是,我应该确保我已部署的内容实际上已经检入我的版本控制系统。即:

hg push (use mercurial directly to push my changes to other developers).
mvn site:deploy (deploys from my local machine using scp).

答案 2 :(得分:0)

首先,我尝试了TheLQ的答案,甚至投票赞成那个(上图),因为它适用于简单的项目,特别是如果你还将maagon-scm和wagon-ssh依赖项添加到maven-site-plugin并更新最新版本的所有版本;)虽然我有一个问题,但是有一个多模块项目:每个子模块的站点都会覆盖以前推送的内容而不是嵌套它们(与mvn deploy相同的问题,即直接部署到Hg托管远程maven仓库不会创建正确的文件夹层次结构)。

因此,这是一个替代解决方案,它也减少了对远程存储库的提交(但是,它需要一些手动工作)。

首先,转到您的Google代码项目,https://code.google.com/p/MYPROJECT,标签“管理”,“来源”并创建一个名为“site”的新存储库(或者您希望如何调用它)。然后,您必须提交并推送至少一个文件,方便地称为“index.html”到该存储库。

其次,在父项目的pom.xml(仅限)中包含以下内容:

<distributionManagement>
<!-- ... other content ...-->
    <site>
        <id>MYPROJECT.googlecode.com</id>
        <name>MYPROJECT auto-generated site</name>
        <url>http://site.MYPROJECT.googlecode.com/hg</url>
    </site>
</distributionManagement>

并且 -

<url>http://site.MYPROJECT.googlecode.com/hg</url>

注意:是的,它是“http:”而不是“https:”;在我的示例中,Maven不会使用URL来实际部署站点内容(我不会执行site-deploy);相反,将使用mvn site site:stage(见下文)。此外,您不必触摸settings.xml(〜/ .m2 / on * nix系统中的那个)。

第三,只需将远程('site')存储库克隆到本地计算机(目标目录可以在父项目的目录下以及其他任何地方 - 只需cd到THAT_DIR你想要的地方):

cd THAT_DIR
hg clone https://USERNAME@code.google.com/p/MYPROJECT.site/

注意:如果它存在,则不必再次克隆,只需执行hg pull,hg update(可选择使用hg rm *和commit删除旧内容)。您也可以使用例如免费的SourceTree软件而不是控制台。

接下来,从项目根目录开始,正常工作(如果你之前已经使用过,请跳过'清理,安装'目标;我使用Maven 3.0.5):

mvn clean install site site:stage -DstagingDirectory=FullPathTo/MYPROJECT.site

最后,切换到克隆/舞台目录,THAT_DIR / MYPROJECT.site,在本地测试网站(在浏览器中打开index.html),如果开心,请执行:

hg add *
hg commit -m "re-generated MYPROJECT"
hg push

http://site.MYREPO.googlecode.com/hg/index.html处查看以及https://code.google.com/p/MYPROJECT.site/

处的来源和更改

完成。