tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:Salesforce MVP Nominations サイトを利用してみました (2018 January 9th Verion)

時間が経ってしまいましたがSalesforce MVP Nominations サイトが公開されました。年に3回新しいSalesforce MVPを推薦できるサイトです。Herokuアプリで作られていました。

f:id:tyoshikawa1106:20180113223108p:plain

Salesforce Trailblazer Community


Start your nomination here!の入力欄に推薦したい人の名前を記入します。(チェックするのは米国Salesforceチームだと思うので英語での記入になります。)
f:id:tyoshikawa1106:20180113223459p:plain


Trailblazer Communityとリンクしているのだと思うのですが、入力した名前からリスト一覧が表示されます。リストから選択すると次ページが表示されるときに初期値がセットされました。リストにいない場合でもNomination を選択すると次のページに移動します。

f:id:tyoshikawa1106:20180124195726p:plain

f:id:tyoshikawa1106:20180124195924p:plain


その人を推薦する理由とTwitterやLinkedIn、Trailblazer CommunityのプロフィールページURLなどの情報を入力できます。
必要事項を入力して登録ボタンをクリックしたら申込完了です。

f:id:tyoshikawa1106:20180124200259p:plain


内容が気になったので日本語翻訳してみたところ、一人で複数人を推薦することができますと記載がありました。
f:id:tyoshikawa1106:20180124200355p:plain


英語で書く必要がありますが、入力内容としては負担の無いレベルのページ数でした。今回のサイトは2018年2月5日で締切とのことです。

SFDC:Salesforce v15.0 for iOSのβ版を試してみました

Salesforce v15.0 for iOS ベータ版を試してみました。今までこういう機会はなかったと思うのですが、ベータプログラムに登録することで最新版を体験できるようになっているみたいです。

f:id:tyoshikawa1106:20180119214508p:plain

Salesforce v15.0 for iOS の新機能

Phone X 対応:
• 新しいエッジツーエッジ画面用に最適化されたアプリケーションを使用できる

更新された機能:
• 最も使用頻度が高い項目にすばやくアクセス。お気に入りから追加や削除も可能
• 新しい検索機能で項目の検索がよりスピーディーに
• 好きなサードパーティキーボードを使用できる (Google Gboard、Swype、Bitmoji)
• Chatter ストリームにアクセスしてカスタムフィードを取得
• ディープリンク経由で Quip アプリケーションで Quip ファイルを開ける
• さらに、バグ修正や GDPR 対応も!

重要な情報:
• Apple の無料の TestFlight アプリケーションを通じてビルドをご利用いただけます。
• TestFlight ビルドにアクセスするには、ベータプログラムにご登録いただく必要があります。このフォームを使用してベータ版にご登録ください。
• TestFlight への招待をまだ承認していない場合は、「TestFlight」でメールを検索して招待メールを承認してください。今後のビルドに関する通知を受け取るには、招待を承認する必要があります。
• ご登録いただくと、ビルドがダウンロード可能になると通知が送られ、TestFlight アプリケーションをインストールするように指示されます。
• 今後のパッチリリースに関する最新情報を知るには、ここから Trailblazer コミュニティの「Salesforce for iOS & Android」グループにご参加ください。

ベータ版の利用手順

AppleのTestFlightアプリを利用します。TestFlightは今まで名前だけ知っていて実際にどういうものかわかっていなかったのですがアプリが公開されていました。

f:id:tyoshikawa1106:20180119214816p:plain

TestFlight on the App Store


続いてメールに記載されたリンクから専用のベータプログラム登録サイトに移動して必要事項を記入します。
f:id:tyoshikawa1106:20180119215042p:plain


登録後、すぐに招待メールが届きました。
f:id:tyoshikawa1106:20180119215235p:plain


メール内のボタンをクリックするとインストール方法の記載されたサイトに移動しました。この情報をつかってiPhoneのTestFlightアプリを起動してβ版のインストールページにアクセスできます。

f:id:tyoshikawa1106:20180119220437p:plain:w250


β版のインストールページは普通のアプリと同じような感じでした。
f:id:tyoshikawa1106:20180119220547p:plain:w250


iPhone X対応が気になっていたのですが、いい感じに表示されるようになっていました。
f:id:tyoshikawa1106:20180119220750p:plain:w250


ちなみに現在のバージョンの場合は次のような感じで黒い部分が表示されてしまいます。
f:id:tyoshikawa1106:20180119220842p:plain:w250


という感じでTestFlightを使ってβ版を試すことができました。TestFlightがどういうものが覚えることができてよかったです。試してみて意外だったのですが、β版アプリはインストール済みの安定版を上書きする形でインストールされました。気になる人は検証用端末などで試すようにした方が良さそうです。

MEMO:Macの初期化作業と復元サーバ接続エラー

利用者変更などでMacBookの初期化作業が必要になるのですが、下記の手順で対応できます。

1. MacBookを起動または再起動
2. shift + option + command + Rを押しっぱなし
3. 通常の起動とは異なり地球マーク的なものが表示されてプレログレスバーが表示されるので待機
4. メニューが表示されるのでディスクユーティリティを選択してデバイスまたはボリュームを選択。
5. 選択後に消去ボタンで保存データ削除
6. 前のページに戻ってmacOS のインストールを選択。
7. インストールが完了すると初期化終了


詳細はこちら。
f:id:tyoshikawa1106:20180119201758p:plain

macOS をインストールする方法 - Apple サポート


これで初期化作業完了なのですが、作業中に下記のようなエラーメッセージが表示されました。

復元サーバーに接続できません。


原因はネットワークに接続できていないためです。画面右上のWiFiマークからいつも通りにWiFi接続設定にアクセスできるのでネットワークに接続した状態で再度macOS のインストールを実行するとエラーが解決しました。ついつい忘れるので自分用にメモです。

SFDC:Lightningアプリケーションへのアップグレードを試してみました

Lightningアプリケーションへのアップグレードを試してみました。
f:id:tyoshikawa1106:20180110115817p:plain


Lightning Experienceのアプリケーションマネージャーページにいくとアップグレードを実行できます。
f:id:tyoshikawa1106:20180110115921p:plain


実行するとラベルやAPI名を指定できます。
f:id:tyoshikawa1106:20180110120209p:plain


アップグレードボタンをクリックすると作成完了です。
f:id:tyoshikawa1106:20180110120250p:plain


Lightningアプリケーションの場合、編集ボタンでユーティリティバーなどの設定が可能になります。
f:id:tyoshikawa1106:20180110120318p:plain


プロファイルの割り当ても実行できるので一部ユーザのみ利用可能にして運用を開始することができます。
f:id:tyoshikawa1106:20180110120402p:plain


既存のアプリケーションをLightningアプリケーションへアップグレードしたとき、Classicでも引き続き使えたか確認したかったのですが、別アプリケーションとして作成されるので問題なさそうでした。(別アプリケーションとして作成されることは途中で記載もありました。)

SFDC:Salesforce DXの開発フローを試してみました

Salesforce DXでLightningアプリの開発をやってみました。

CLIの環境構築とエディタについてはこちら。

DevHub組織への接続

DevHub組織へログインします。

$ sfdx force:auth:web:login -d -a DevHub


コマンドを実行するとブラウザでログインページが表示されるのでいつもどおりログインと認証をすれば完了です。下記コマンドで正しく接続できているか確認できます。

$ sfdx force:org:list

f:id:tyoshikawa1106:20180105144004p:plain


上のコマンドでDevHubというエイリアス名で登録できているので、以後は下記コマンドでログイン可能になります。

$ sfdx force:org:open -u DevHub
オプションの見方
  • d : DevHub組織としての登録
  • a : エイリアスを登録する際に指定

Salesforce DXのプロジェクト作成

デスクトップにgeolocationという名前のプロジェクトを作成します。

$ cd desktop
$ mkdir app
$ cd app
$ sfdx force:project:create -n geolocation
$ cd geolocation


VS Codeでgeolocationフォルダを表示します。
f:id:tyoshikawa1106:20180105144838p:plain

スクラッチ組織の作成

下記のコマンドでスクラッチ組織を作成できます。スクラッチ組織のエイリアス名は「GeoAppScratch」を指定。

$ sfdx force:org:create -s -f config/project-scratch-def.json -a GeoAppScratch


作成後はDevHub組織でスクラッチ組織の情報にアクセスできます。
f:id:tyoshikawa1106:20180105145934p:plain

スクラッチ組織作成時の重要なオプション
  • s : このスクラッチ組織をこのプロジェクトのデフォルト組織にすることを指定します。

これでオブジェクト作成コマンドなどはスクラッチ組織を対象となります。


force:org:listコマンドを確認したところこのようになっていました。
f:id:tyoshikawa1106:20180105150711p:plain

スクラッチ組織にアクセス

下記コマンドでスクラッチ組織を開きます。-sでデフォルト指定しているので組織名は指定不可になっていると思います。

$ sfdx force:org:open


正しくスクラッチ組織にアクセスしているかは組織IDで確認できると思います。マイドメインは自動で登録されました。※DevHub組織との関連性なし。
f:id:tyoshikawa1106:20180105151406p:plain

確認中に気になった点

DevHub組織で作成したカスタムオブジェクトはスクラッチ組織に移行されていませんでした。Sandboxのようには使えないのかもしれません。

カスタム項目の作成

スクラッチ組織でカスタム項目を作成します。

  • [取引先] をクリックします。
  • [項目とリレーション] セクションで、[新規] をクリックします。
  • データ型に [地理位置情報] を選択し、[次へ] をクリックします。
  • 次の詳細を入力して、[次へ] をクリックします。
  • 項目の表示ラベル: Location (場所)
  • 緯度および経度表示の表記法: 小数
  • 小数部の桁数: 7
  • 項目名: Location (場所)

f:id:tyoshikawa1106:20180105152105p:plain


次の動作確認のため権限は除外します。
f:id:tyoshikawa1106:20180105152149p:plain


Location項目のアクセス権限を付与する権限セットを作成します。
f:id:tyoshikawa1106:20180105152423p:plain

f:id:tyoshikawa1106:20180105152436p:plain


下記のコマンドでユーザに権限セットの割当ができます。

$ sfdx force:user:permset:assign -n Geolocation

※Geolocationは権限セットの名前を指定

f:id:tyoshikawa1106:20180105152621p:plain


無事に割り当てが実行できていました。
f:id:tyoshikawa1106:20180105152655p:plain

スクラッチ組織の変更をローカル環境に反映

下記のコマンドを実行するとスクラッチ組織の変更をローカルのプロジェクトに反映できます。

$ sfdx force:source:pull

f:id:tyoshikawa1106:20180105152945p:plain


変更箇所のみが反映されるようです。ローカルのプロジェクトをみるとlayoutやobjectフォルダが追加されていました。
f:id:tyoshikawa1106:20180105153057p:plain

Gitでバージョン管理

Salesforce DXはGitなどによるバージョン管理を行なうことが前提の仕組みです。GitHubやBitbucketなどありますが、今回はプライベートリポジトリが利用できるBitbucketを使ってみます。


このような感じでリポジトリの新規作成を行いました。
f:id:tyoshikawa1106:20180106150547p:plain


これでssh urlの部分が取得できます。下記のコマンドを実行します。

$ git init
$ git remote add origin <ssh url>
$ git add -A
$ git commit -m "Add custom object and permset"
$ git push origin master


cdコマンドでgeolocationフォルダの一番上に移動している状態で実行しました。
f:id:tyoshikawa1106:20180106151004p:plain


これでローカルのソースコードをBitbucketのリポジトリに保存できました。
f:id:tyoshikawa1106:20180106151245p:plain


注意しないとプロジェクトごとにバラバラになってしまいそうなフォルダの階層管理もDXでは雛形を用意してくれます。またREADME.mdファイルもテンプレートがあるのでこれに合わせていけばよさそうです。

サンプルデータ

組織作成後に一番困るのはサンプルデータの作成です。Salesforce DXではサンプルデータを簡単にインポートできる仕組みが用意されています。

Salesforce組織でテストデータを作成

まずはスクラッチ組織にアクセスします。未ログインの場合はopenコマンドでアクセス可能です。

$ sfdx force:org:open


今回作成するのは取引先レコードです。
f:id:tyoshikawa1106:20180106151912p:plain


データの準備ができたらdataフォルダをプロジェクトに追加します。

$ mkdir data


次のコマンドでスクラッチ組織のサンプルデータをエクスポートできます。

$ sfdx force:data:tree:export -q "SELECT Name, Location__Latitude__s, Location__Longitude__s FROM Account WHERE Location__Latitude__s != NULL AND Location__Longitude__s != NULL" -d ./data

f:id:tyoshikawa1106:20180106152157p:plain


サンプルデータはJSON形式でエクスポートされます。インポートする際にJSON形式になっていればいいので、手動で作成したりも可能となっています。
f:id:tyoshikawa1106:20180106152252p:plain


作成したサンプルデータをインポートすれば組織作成後に簡単にテストデータを作成できます。わかりやすくなるように先ほどのデータは削除しました。
f:id:tyoshikawa1106:20180106152518p:plain



インポートは次のコマンドになります。

$ sfdx force:data:tree:import --sobjecttreefiles data/Account.json

f:id:tyoshikawa1106:20180106152608p:plain


スクラッチ組織を確認したところ正常に作成できていました。
f:id:tyoshikawa1106:20180106152734p:plain


こうしたインポート用のサンプルデータもGitリポジトリで管理できるようになります。
f:id:tyoshikawa1106:20180106153033p:plain


入力規則やトリガの追加があるので一度つくったサンプルデータをアップデートしていくのは頻繁に発生すると思います。こうした情報も管理できるようになるのはすごく良さそうです。

地理位置情報アプリケーションの作成

ここまでで開発用組織とサンプルデータ、Gitリポジトリの準備ができました。ここからLightningアプリの開発を行います。

Apex コントローラクラスの作成

次のコマンドでApexクラスを作成できます。

$ sfdx force:apex:class:create -n AccountController -d force-app/main/default/classes

f:id:tyoshikawa1106:20180106153416p:plain


エディタで次のように処理を実装します。 (インデントは適当ですが・・)
f:id:tyoshikawa1106:20180106153603p:plain


保存後に下記のコマンドを実行するとスクラッチ組織にアップロードされます。

$ sfdx force:source:push

f:id:tyoshikawa1106:20180106153719p:plain

public with sharing class AccountController {
 @AuraEnabled
 public static List<Account> findAll() {
 return [SELECT Id, Name, Location__Latitude__s, Location__Longitude__s
   FROM Account
   WHERE Location__Latitude__s != NULL AND Location__Longitude__s !=
          NULL
   LIMIT 50];
  }
}

無事に保存できていました。
f:id:tyoshikawa1106:20180106153815p:plain


エラーチェックも当然実施されました。
f:id:tyoshikawa1106:20180106153906p:plain

Lightning コンポーネントの作成

続いてLightning コンポーネントの作成です。下記のコマンドを実行します。

$ sfdx force:lightning:component:create -n AccountListItem -d force-app/main/default/aura

f:id:tyoshikawa1106:20180106154052p:plain


AccountListItemのソースコードはこんな感じ。
【AccountListItem.cmp】

<aura:component>
  <aura:attribute name="account" type="Account"/>
  <li><a>{!v.account.Name}</a></li>
</aura:component>

【AccountListItem.css】

.THIS {
    border-bottom: solid 1px #DDDDDD;
}

.THIS a {
    display: block;
    padding: 20px;
    color: inherit;
}

.THIS a:active {
    background-color: #E8F4FB;
}

コーディングはVS Codeから行っています。
f:id:tyoshikawa1106:20180106154319p:plain



AccountList コンポーネントを作成します。

$ sfdx force:lightning:component:create -n AccountList -d force-app/main/default/aura

f:id:tyoshikawa1106:20180106154412p:plain


【AccountList.cmp】

<aura:component controller="AccountController">

    <aura:attribute name="accounts" type="Account[]"/>
    <aura:handler name="init" value="{!this}" action="{!c.doInit}" />

    <ul>
    <aura:iteration items="{!v.accounts}" var="account">
        <c:AccountListItem account="{!account}"/>
    </aura:iteration>
    </ul>

</aura:component>

【AccountListController.js】

({
    doInit : function(component, event) {
        var action = component.get("c.findAll");
        action.setCallback(this, function(a) {
          component.set("v.accounts", a.getReturnValue()); 
        });
        $A.enqueueAction(action);
    }
})

【AccountList.css】

.THIS {
    list-style-type: none;
    padding: 0;
    margin: 0;
    background: #FFFFFF;
     height: 100%;
}


AccountLocatorコンポーネントを作成します。

$ sfdx force:lightning:component:create -n AccountLocator -d force-app/main/default/aura

f:id:tyoshikawa1106:20180106155408p:plain

【AccountLocator.cmp】

<aura:component implements="force:appHostable">
    <div>
        <div>AccountMap goes here</div>
        <div>
          <c:AccountList/>
        </div>
    </div>
</aura:component>

【AccountLocator.css】

.THIS {
  position:absolute;
  height: 100%;
  width: 100%;
  background: #FFFFFF;
}

.THIS>div {
  height: 50%;
}


これでコンポーネントの準備ができました。下記コマンドでスクラッチ組織にプッシュします。

$ sfdx force:source:push

f:id:tyoshikawa1106:20180106155702p:plain


作成したLightningコンポーネントへのアクセスはタブから行います。
f:id:tyoshikawa1106:20180106155905p:plain


このように表示されればひとまずOKです。
f:id:tyoshikawa1106:20180106160009p:plain


スクラッチ組織でタブを作成したのでローカルプロジェクトに持ってきます。

$ sfdx force:source:pull

f:id:tyoshikawa1106:20180106161538p:plain

地図表示処理の実装

Leafletのサイトから最新の安定バージョンをダウンロードします。

Download - Leaflet - a JavaScript library for interactive maps


静的リソースに保存します。
f:id:tyoshikawa1106:20180106161856p:plain


ローカルプロジェクトに反映します。

$ sfdx force:source:pull


試していてちょっとびっくりしたのですがSalesforce DXの機能で管理すればZipファイルの中身がきちんと解凍された状態で取得されました。
f:id:tyoshikawa1106:20180106162210p:plain

AccountMap コンポーネントの作成

AccountMap コンポーネントを作成します。

$ sfdx force:lightning:component:create -n AccountMap -d force-app/main/default/aura

【AccountMap.cmp】

<aura:component>

    <aura:attribute name="map" type="Object"/>

    <ltng:require styles="/resource/leaflet/leaflet.css"
        scripts="/resource/leaflet/leaflet.js"
        afterScriptsLoaded="{!c.jsLoaded}" />

    <div id="map"></div>

</aura:component>

【AccountMapController.js】

({
   jsLoaded: function(component, event, helper) {

      var map = L.map('map', {zoomControl: false}).setView([37.784173, -122.401557], 14);
      L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
        {
              attribution: 'Tiles © Esri'
        }).addTo(map);
      component.set("v.map", map);
  }
})

【AccountMap.css】

.THIS {
   width: 100%;
   height: 100%;
}

【AccountLocator.cmp】

<aura:component implements="force:appHostable">

    <div>
        <div>
            <c:AccountMap />
        </div>

        <div>
            <c:AccountList />
        </div>
    </div>

</aura:component>


スクラッチ組織にアップロード

$ sfdx force:source:push


Leafletの地図が表示されることを確認できます。
f:id:tyoshikawa1106:20180106162930p:plain

地図にマーカーを追加する Lightning イベントの作成

AccountsLoaded イベントを作成します

$ sfdx force:lightning:event:create -n AccountsLoaded -d force-app/main/default/aura

f:id:tyoshikawa1106:20180106163905p:plain

【AccountsLoaded.evt】

<aura:event type="APPLICATION">
    <aura:attribute name="accounts" Type="Account[]"/>
</aura:event>

【AccountList.cmp】

<aura:component controller="AccountController">
    <aura:registerEvent name="accountsLoaded" type="c:AccountsLoaded"/>
    <aura:attribute name="accounts" type="Account[]"/>
    <ltng:require styles="/resource/leaflet/leaflet.css" scripts="/resource/leaflet/leaflet.js" afterScriptsLoaded="{!c.doInit}" />
    <aura:handler name="init" value="{!this}" action="{!c.doInit}" />

    <ul>
    <aura:iteration items="{!v.accounts}" var="account">
        <c:AccountListItem account="{!account}"/>
    </aura:iteration>
    </ul>

</aura:component>

【AccountListController.js 】

({
    doInit : function(component, event) {
        var action = component.get("c.findAll");
        action.setCallback(this, function(a) {
            component.set("v.accounts", a.getReturnValue());
            var event = $A.get("e.c:AccountsLoaded");
            event.setParams({"accounts": a.getReturnValue()});
            event.fire();
        });
    $A.enqueueAction(action);
    }
})

【AccountMap.cmp】

<aura:component>

    <aura:attribute name="map" type="Object"/>
    <aura:handler event="c:AccountsLoaded" action="{!c.accountsLoaded}"/>

    <ltng:require styles="/resource/leaflet/leaflet.css"
        scripts="/resource/leaflet/leaflet.js"
        afterScriptsLoaded="{!c.jsLoaded}" />

    <div id="map"></div>

</aura:component>

【AccountMapController.js】

({
    jsLoaded: function(component, event, helper) {

        var map = L.map('map', {zoomControl: false}).setView([37.784173, -122.401557], 14);
        L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',
             {
                 attribution: 'Tiles © Esri'
             }).addTo(map);
        component.set("v.map", map);
    },

    accountsLoaded: function(component, event, helper) {

        // Add markers
        var map = component.get('v.map');
        var accounts = event.getParam('accounts');
        for (var i=0; i<accounts.length; i++) {
            var account = accounts[i];
            var latLng = [account.Location__Latitude__s, account.Location__Longitude__s];
            L.marker(latLng, {account: account}).addTo(map);
        }  
    }
})


更新を反映します。

$ sfdx force:source:push


マーカーが表示されるようになりました。
f:id:tyoshikawa1106:20180106164439p:plain

アプリケーションの検証

Trailheadにアプリケーション検証用のスクラッチ組織を作成してそちらで検証するのがいいと説明がありました。

開発で使用したスクラッチ組織を使用してテストを行うことももちろんできますが、常に新しいスクラッチ組織で開始することをお勧めします。新しいスクラッチ組織を使用することで、すべてのソースが組織の外部に適切に置かれていることを確認できます。


新しいスクラッチ組織を作成します。

$ sfdx force:org:create -f config/project-scratch-def.json -a GeoTestOrg


ローカルのソースとメタデータをスクラッチ組織に転送します。

$ sfdx force:source:push -u GeoTestOrg


権限セットを割り当てます。

$ sfdx force:user:permset:assign -n Geolocation -u GeoTestOrg


組織にサンプルデータを読み込みます。

$ sfdx force:data:tree:import -f data/Account.json -u GeoTestOrg


組織を開きます。

$ sfdx force:org:open -u GeoTestOrg


新しいスクラッチ組織でも問題なく動きました。
f:id:tyoshikawa1106:20180106165816p:plain



今回は基本的な部分なのでその他の部分も覚えないといけないことが多そうです。ひとまずスクラッチ組織の使い方はなんとなく理解できたのでよかったです。(Sandboxみたいに本番組織のコピー組織だと思ってました。)

参考

SFDC:開発者ハブ (Dev Hub)の有効化時の注意点

Salesforce DXの開発フローを導入するには開発者ハブ (Dev Hub)の有効化が必要になりますが、1点注意がありました。

f:id:tyoshikawa1106:20180105140643p:plain


Salesforce DX の使用を開始するには、Dev Hub として機能する組織を選択します。Dev Hub は任意の有料組織で有効にできますが、本番組織以外の組織を使用することをお勧めします。・・とのことです。


試していませんがSandbox組織でも有効化できるっぽいです。本番で有効化するデメリットはわかりませんが、社内エンジニアの勉強用に有効化する場合はSandbox組織の方が良いかもしれません。(Sandbox組織は25個まで作成可能だったと思うので1開発者につき1つ組織を作るといったことはできないと思いますが。。)

参考

追記

本番組織以外の組織を使用することをお勧めしますということでSandbox組織で利用できると勘違いしたのですが、この記載はTrailheadなどで試す場合は本番組織ではなくトライアル環境を利用しましょうという意味でした。実際のプロジェクトは本番組織のDevHubを利用すればいいみたいです。

SFDC:Salesforce DXのアプリ開発を少し試してみました

Salesforce DXのアプリ開発を試してみました。開発者ガイドが用意されているのでこちらを参照。


CLIの環境構築とエディタについてはこちら。



デスクトップにappフォルダを作成してここで試します。
f:id:tyoshikawa1106:20180103180800p:plain

Salesforce DX プロジェクトの作成

myworkは任意のプロジェクト名です。

$ sfdx force:project:create --projectname mywork

ディレクトリの指定をする場合はこちら。

sfdx force:project:create --projectname mywork --defaultpackagedir myapp

f:id:tyoshikawa1106:20180103222803p:plain


これでappフォルダ内にmyworkプロジェクトが作成されました。VS Codeにドラッグ&ドロップするとエディタで表示できます。
f:id:tyoshikawa1106:20180103223200p:plain


configフォルダにSalesforce DXの環境ファイルが用意されています。DevHub組織未ログインでも作成されました。(※事前にやった過去ログインの設定情報削除されていれば...)
f:id:tyoshikawa1106:20180103223349p:plain


README.mdファイルも雛形が作成されています。
f:id:tyoshikawa1106:20180103223439p:plain


forceignoreというファイルも作成されました。gitignoreと同じ効果だと思います。
f:id:tyoshikawa1106:20180103223518p:plain


sfdx-project.jsonも設定ファイルです。API名とか指定できるようでした。
f:id:tyoshikawa1106:20180103223601p:plain

開発環境にログイン

$ sfdx force:org:open -u <登録したい組織の別名>

下記コマンドで登録されていることを確認できます。

$ sfdx force:org:list

ユーザ名の登録

ローカル環境でのみ利用できる開発者ユーザ名を登録します。

$ sfdx force:config:set defaultusername=<ユーザ名>

実行すると.sfdxフォルダにsfdx-config.jsonが生成されます。
f:id:tyoshikawa1106:20180103230003p:plain

package.xmlの準備

README.mdファイルと同じ階層に用意します。

<?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>ApexComponent</name>
	</types>
	<types>
		<members>*</members>
		<name>ApexPage</name>
	</types>
	<types>
		<members>*</members>
		<name>ApexTrigger</name>
	</types>
	<types>
		<members>*</members>
		<name>StaticResource</name>
	</types>
	<version>41.0</version>
</Package>

ソースコードのダウンロード

下記のコマンドでソースコードをダウンロードします。

$ sfdx force:mdapi:retrieve -r ./mdapipkg -u <ユーザ名またはエイリアス> -k ./package.xml


mdapipkgフォルダにZipファイルがダウンロードされます。それを解答するとソースコード一式を確認できます。
f:id:tyoshikawa1106:20180103234220p:plain


このあと下記コマンドでDX用に変換します。

$ sfdx force:mdapi:convert --rootdir ./mdapipkg/unpackaged


これでmainフォルダ内にソースコードをダウンロードできました。
f:id:tyoshikawa1106:20180103234422p:plain



ここまではうまく行きましたがソースコードのデプロイや最新版の取得はやはりDXの機能でDevHubとスクラッチ組織で実行が必要になります。DE組織での開発はJSforceコマンドをつかった方が良さそうです。


・・・MavensMateになれているのでコマンドで開発していける気がしなくなってきました。