2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【SFDX】VSCodeでSFDXコマンドの不便さを解消する

Posted at

TL;DR

SF開発でVSCode使ってるけど、本番環境へのデプロイとかが簡単に出来ない
独自のコマンドを作ることで、主に本番環境への操作を楽にしたい

背景

VSCodeでSalesforceCLIコマンドを使ってSF開発をしていると、以下の問題に直面します。
本番環境へのデプロイが、右クリックから出来ない!!!

Spring'19から、本番環境へのデプロイにはテスト実行が必須(NoTestRun指定不可)となりました。
これにより、右クリック > "SFDX:Deploy source to Org"が使えなくなりました。(Sandboxには可能)

つまり、

sfdx force:source:deploy -p force-app -l NoTestRun

は、本番環境ではエラーとなり、

sfdx force:source:deploy -p force-app -l RunSpecifiedTests -r "TESTCLASSNAME"

と、Apexクラスに対するテストクラスを指定する必要があリます。
しかし、一度に複数のApexクラスを修正している時など、テストクラスを全部指定するのは面倒。
かと言って、変更セットで上げたりするのも、VSCode使ってるのになんだかなぁとなる。

その他にも細々とした不便さを感じることがあったので、解消するためのコマンド関数を作成しaliasを作ってみました。

解決方法

.bashrcに以下の通りデプロイ用関数を定義した

function deploy2SF() {
    SRC_DIR='./src';
    TARGET_DIR=$SRC_DIR'/classes/';
    # srcフォルダの確定
    if [ ! -d $SRC_DIR ]; then
        SRC_DIR='force-app';
        TARGET_DIR=$SRC_DIR'/main/default/classes/';
    fi

    TEST_NAMES='';
    TEMPSTR='';
    # Testクラスを列挙する
    if [ ! -d $TARGET_DIR ]; then
        # ダミーテストクラス(組織に作成済み)
        TEST_NAMES='NoRunTest';
    else
        while read file; do
            TEMPSTR=${file##*/};
            if [$TEST_NAMES -eq '']; then
                TEST_NAMES=${TEMPSTR%.*};
            else
                TEST_NAMES+=','${TEMPSTR%.*};
            fi
        done < <(find $TARGET_DIR -type f -name *Test*.cls)
    fi
    echo $TEST_NAMES;
    # source:deployだと、モジュールごとに履歴流れるのでやめた
    #sfdx force:source:deploy -p $SRC_DIR -l RunSpecifiedTests -r $TEST_NAMES;

    # Force.com時同様、プロジェクト一括デプロイ方式(mdapi:deploy)に統一 => srcフォルダ配下にpackage.xml突っ込んでzipファイルごとデプロイする
    cp manifest/package.xml $SRC_DIR/
    sfdx force:mdapi:deploy -d $SRC_DIR -l RunSpecifiedTests -r $TEST_NAMES;
    rm $SRC_DIR/package.xml
}

alias sfdeploy=deploy2SF

このaliasにより、clssessフォルダにあるApexクラスをデプロイする際に同フォルダ内の全テストクラスを一括指定することが出来ます。

尚、「NoRunTes」クラスはこんな感じ

@isTest
public class NoRunTest {
    @isTest
    static void test001() {}
}

その他にもいくつか関数を作ったので、Gistに上げておきます。
https://gist.github.com/shinya-ochi/8dc747c5acc97c514fffd1e8a7bf173c

まとめ

基本、自前の関数で何とかするのが手っ取り早い。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?