dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[Salesforce] 初心者向け Force.com Migration Tool用ファイル群を作った

初心者向けと書いてますが、ほとんど自分が普段使う用。
これから Force.com Migration Tool (Force.com 移行ツール)を使ってみようという人にも参考になるかも。

Force.com Migration Tool には最初からサンプルの build.xml が入ってるけど、

  • 正直あんまり使わないなーと思うコマンドがある
  • 日本語で解説している記事がほぼない

ので、整理しつつ日本語でコメントしてみた。

基本的な使い方は README を見てください。

ディレクトリ構成

├── build.properties
├── build.xml
├── codepkg
│   └── package.xml
├── removecodepkg
│   ├── destructiveChanges.xml
│   └── package.xml
└── retrievecodepkg
    └── package.xml

build.xml

<project name="Salesforce Ant tasks" default="deployCode" basedir="." xmlns:sf="antlib:com.salesforce">

    <property file="build.properties"/>
    <property environment="env"/>

    <!-- コードを組織から取得 -->
    <target name="retrieveCode">
        <sf:retrieve
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"
            maxPoll="${sf.maxPoll}"
            retrieveTarget="retrievecodepkg"
            unpackaged="retrievecodepkg/package.xml"/>
    </target>

    <!-- コードを組織にデプロイ -->
    <target name="deployCode">
        <sf:deploy
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"
            maxPoll="${sf.maxPoll}"
            deployRoot="codepkg">
        </sf:deploy>
    </target>

    <!-- コードを組織から削除 -->
    <!-- deployRoot に指定したディレクトリ内に
        package.xml と destructiveChanges.xml を置く -->
    <target name="removeCode">
        <sf:deploy
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"
            maxPoll="${sf.maxPoll}"
            deployRoot="removecodepkg"/>
    </target>

    <!-- コードをデプロイし、テストを実行する -->
    <target name="deployCodeAndRunTests">
        <sf:deploy
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"
            maxPoll="${sf.maxPoll}"
            deployRoot="codepkg"
            runAllTests="true"
            logType="Debugonly"/>
    </target>

    <!-- コードがデプロイ可能かどうか、チェックのみ行う -->
    <target name="deployCodeCheckOnly">
        <sf:deploy
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"
            maxPoll="${sf.maxPoll}"
            deployRoot="codepkg"
            checkOnly="true"/>
    </target>

    <!-- メタデータの一覧を表示する
        ref. http://qiita.com/zaki-yama/items/4b66b86900b604794f3d  -->
    <target name="describeMetadata">
        <sf:describeMetadata
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"/>
    </target>
    <!-- 特定の sf.metadataType のメタデータ情報を取得する
        (sf.metadataType は build.properties に記述する) -->
    <target name="listMetadata">
        <sf:listMetadata
            username="${sf.username}"
            password="${sf.password}"
            serverurl="${sf.serverurl}"
            metadataType="${sf.metadataType}"/>
    </target>
</project>

retrieve と deploy でディレクトリを分けるべきか?

ここは好みで。

私はちょっとしたプログラムを書いてデプロイする時にディレクトリを分けたいと思ったので
組織から retrieve したものと混ざらないようそうした。