ASK-CLIをカスタマイズして利用する

ASK CLIのVersion2はOSSなので、Issueやプルリクエストによる機能要望やバグ修正のリクエストがやりやすいです。 が、急ぎで必要になる場合などにはマージとリリースが待てないということもあります。 というわ […]

広告ここから
広告ここまで

目次

    ASK CLIのVersion2はOSSなので、Issueやプルリクエストによる機能要望やバグ修正のリクエストがやりやすいです。

    が、急ぎで必要になる場合などにはマージとリリースが待てないということもあります。

    というわけでカスタマイズしたCLIを使う方法をまとめました。

    メリット

    自分のローカルでソースをいじって動かすので、手早く欲しい機能が手に入ります。

    「どうもバグってるみたい or 機能が要件に足りてないみたいだけど、いまこれやりたい」という時に手早く対応できるのはメリットです。

    欠点

    当然ですが、Forkしたプロジェクトという立ち位置になるためメンテナンスを自分でやる必要が出てきます。

    カスタマイズしたものは絶対パスまたは独自のエイリアスで使うようにするなどして、普段使いはnpmでリリースされている最新版を使うようにしましょう。

    カスタマイズ方法

    Step1: GitHubからプロジェクトをDLする

    まずはGitHubからソースをもってきます。ForkしてからCloneしておくと、Pull Requestが作りやすくておすすめです。

    $ git clone [email protected]:YOUR_USERNAME/ask-cli.git
    $ cd ask-cli
    $ npm install

    Step2: CLIのコードをカスタマイズする

    ローカルに落とせたら、あとはコードをカスタマイズしましょう。

    これは自分がたまに使っているカスタマイズのDiffです。

    --- a/lib/builtins/deploy-delegates/cfn-deployer/helper.js
    +++ b/lib/builtins/deploy-delegates/cfn-deployer/helper.js
    @@ -19,6 +19,13 @@ module.exports = {
         deployStack,
     };
     
    +function getS3BucketName(awsProfile, awsRegion, userConfig, deployState) {
    +    const currentBucketName = R.view(R.lensPath(['s3', 'bucket']), deployState);
    +    if (currentBucketName) return currentBucketName;
    +    if (userConfig.deploymentBucket) return userConfig.deploymentBucket;
    +    return S3Client.generateBucketName(awsProfile, awsRegion);
    +}
    +
     function getAwsInformation(awsProfile, alexaRegion, userConfig, deployState) {
         let awsRegion = alexaRegion === 'default' ? userConfig.awsRegion
             : R.view(R.lensPath(['regionalOverrides', alexaRegion, 'awsRegion']), userConfig);
    @@ -32,7 +39,7 @@ function getAwsInformation(awsProfile, alexaRegion, userConfig, deployState) {
             throw 'The template path in userConfig must be provided.';
         }
     
    -    const bucketName = R.view(R.lensPath(['s3', 'bucket']), deployState) || S3Client.generateBucketName(awsProfile, awsRegion);
    +    const bucketName = getS3BucketName(awsProfile, awsRegion, userConfig, deployState);
    
    // from https://github.com/alexa/ask-cli/pull/134/files#diff-c169b6c84cc10becf8a53c0aff03a126

    CloudFormationでデプロイする時に、デプロイバケットを指定したかったのでカスタマイズしています。(Pull Requestはマージまち)

    Step3:カスタムしたCLIを使う

    あとはForkしたプロジェクトのパスを調べて、bin/ask.jsを実行するだけです。

    // Check the forked project directory
    $ pwd
    /Users/develop/ask-cli
    
    // Run the forked CLI
    $ node /Users/develop/ask-cli/bin/ask.js --help

    自分のカスタマイズサンプルを動かした例ですが、ちゃんとバケットが指定したものに変わっているのがわかります。

    $ node /Users/develop/ask-cli/bin/ask.js deploy
    
    ==================== Deploy Skill Metadata ====================
    Skill package deployed successfully.
    Skill ID: amzn1.ask.skill.xxxx-xxx-xxx-xxx
    
    ==================== Build Skill Code ====================
    npm WARN [email protected] No repository field.
    
    added 17 packages from 69 contributors and audited 20 packages in 1.875s
    found 0 vulnerabilities
    
    Skill code built successfully.
    Code for region default built to /Users/develop/ForkedExample/.ask/lambda/build.zip successfully with build flow nodejs-npm.
    
    ==================== Deploy Skill Infrastructure ====================
    {
      bucketName: 'my.custom.s3.bucket',
      bucketObjectVersion: undefined
    }
      ⠴ Deploy Alexa skill infrastructure for region "default"
        → Uploading code artifact to s3://my.custom.s3.bucket/endpoint/build.zip

    まとめ

    やり方さえ覚えれば、ASK CLIをちょっとカスタマイズして使うことはとても簡単です。

    ですが常用して使うことはお勧めしません。セキュリティの問題や新機能の対応といったコアのアップデートに追従できなくなる恐れがありますし、カスタマイズしすぎたことでコンフリクトが発生してしまうと目も当てられません。

    カスタマイズした機能がどうしても欲しい場合は、GitHubでプルリクエストをだして、マージされるのを待つ間だけ使うようにしましょう。

    リジェクトされた場合・・・?

    その場合は使い方か考え方が間違っているかもしれないという見方をするか、Forkしてしまうかの2択かなと思いますので頑張ってください。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark