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
まとめ
基本、自前の関数で何とかするのが手っ取り早い。