tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:gulp-jsforce-deployを試してみました

Gulpを使ってSalesforceにDeployできる『gulp-jsforce-deploy』を試してみました。

f:id:tyoshikawa1106:20160328102905p:plain

GitHub - jsforce/gulp-jsforce-deploy: Deploying Salesforce package using JSforce (no Migration Tool dependency)

Setup

gulpのインストール

いらないかもしれないけど一応。

$ sudo npm install gulp -g
作業環境準備
$ cd desktop
$ mkdir work
$ cd work
$ npm init
$ npm install gulp gulp-zip gulp-jsforce-deploy --save-dev
  • npm initのnameなどはデフォルトでOKです。
  • npm installで『gulp』『gulp-zip』『gulp-jsforce-deploy』の3つのパッケージがインストールされます。
  • 『--save-dev』でpackage.jsonのdevDependenciesに自動で書き込まれます。
プロジェクトのファイル構成

次のファイル構成で用意します。

├── gulpfile.js
├── package.json
└── pkg
    ├── classes
    ├── objects
    ├── package.xml
    ├── pages
    └── staticresources

f:id:tyoshikawa1106:20160328091930p:plain


gulpfile.jsの内容は次のとおりです。

var gulp = require('gulp');
var zip = require('gulp-zip');
var forceDeploy = require('gulp-jsforce-deploy');

gulp.task('deploy', function() {
  gulp.src('./pkg/**', { base: "." })
    .pipe(zip('pkg.zip'))
    .pipe(forceDeploy({
      username: process.env.SF_USERNAME,
      password: process.env.SF_PASSWORD
      //, loginUrl: 'https://test.salesforce.com'
      //, pollTimeout: 120*1000
      //, pollInterval: 10*1000
      //, version: '33.0'
    }));
});


package.xmlの内容はこんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <types>
        <members>*</members>
        <name>ApexClass</name>
    </types>
    <types>
        <members>*</members>
        <name>ApexPage</name>
    </types>
    <types>
        <members>*</members>
        <name>CustomObject</name>
    </types>
    <types>
        <members>*</members>
        <name>StaticResource</name>
    </types>
    <version>36.0</version>
</Package>
Apexクラスの用意

お試し用のApexクラスを用意します。

public with sharing class MyApexController {

    public MyApexController() {
        System.debug('Hello! Gulp-JSforce-Deploy!!');
    }
}

f:id:tyoshikawa1106:20160328092754p:plain

デプロイコマンドの実行

次のようにユーザ名とパスワードを指定してデプロイできるみたいです。

$ SF_USERNAME=username@example.com SF_PASSWORD=yourpassword gulp deploy


ただ毎回入力するのは少し大変。今回はもう一つ用意された方法を確認してみました。『.env』ファイルを用意する方法です。

SF_USERNAME=<ユーザ名>
SF_PASSWORD=<パスワード>

f:id:tyoshikawa1106:20160328093143p:plain

この『.env』ファイルはgitリポジトリには追加せずに利用するものだと思います。特にGitHubなどのパブリックなリポジトリの見えるところには追加しないように注意した方がよさそうです。

giboコマンドでgitignoreの作成

次のコマンドで.gitignoreを作成できます。

$ gibo SublimeText OSX Windows Node >> .gitignore

次のコマンドでSublimeTextで.gitignoreファイルを開けます。(事前に設定が必要)

$ subl .gitignore

先頭に.envを追記します。
f:id:tyoshikawa1106:20160328094134p:plain


この設定で『git add .』コマンド実行時に『.env』ファイルが対象外になると思います。
f:id:tyoshikawa1106:20160328094253p:plain

formanの準備

デプロイ時にformanコマンドを利用するのでGemからインストールしておきます。

gem install foreman


こちらの解説がわかりやすかったです。

foreman で アプリケーションを動かす。 - Qiita


以上でSetup完了です。

Salesforceにデプロイ

.envファイルを用意したら次のコマンドでデプロイできます。

$ foreman run gulp deploy
  • ユーザ名とパスワードが間違っている場合でも、エラーにはならないので注意してください。
    • Deploying to server...が実行されずに処理が終了します。
  • XMLファイルがない場合はエラーになります。
    • Error on pkg/classes/MyApexController.cls : Must specify the metadata file


正しく設定できていればデプロイが正常実行されてSalesforce内にApexクラスが作成されていると思います。
f:id:tyoshikawa1106:20160328100044p:plain

サンプルプロジェクト

ApexページとApexクラスをDeployできるサンプルプロジェクトです。

関連記事

おまけ

Building Static Filesの方法についてJSforceブログに紹介されています。