Azure Pipelines でバックグランドタスクを実行する方法

appium をバックグラウンドで実行しておき、E2E テストを別タスクで実行したかったのだけれど、普通に appium & を実行するとここで当該タスクが終了せずに待ち続ける...

なので、START /B <コマンド> と呼び出せば OK。

- script: |
    START /B npm run start-background
  displayName: 'Run appium server'

参考

docs.microsoft.com

Prettier の Options デフォルト値

デフォルト値がちょこちょこ変わっていたりするのでメモしておこうと。2023-7-6 現在最新の v3.0.0 をベースにしています。公式ドキュメントで [Deprecated] となっているものは記載していません。

printWidth: 80
tabWidth: 2
useTabs: false
semi: true
singleQuote: false
quoteProps: "as-needed"
jsxSingleQuote: false
trailingComma: "all"
bracketSpacing: true
bracketSameLine: false
arrowParens: "always"
rangeStart: 0
# デフォルト値は無限大。実際の値は数値で指定。
# rangeEnd: Infinity
parser: "none"
filepath: "none"
requirePragma: false
insertPragma: false
proseWrap: "preserve"
htmlWhitespaceSensitivity: "css"
vueIndentScriptAndStyle: false
endOfLine: "lf"
embeddedLanguageFormatting: "auto"
singleAttributePerLine: false

公式ドキュメントはここ。 prettier.io

ちなみに、Prettier と重複している EditorConfig の設定は以下の 4 つ。

  • end_of_line
  • indent_style
  • indent_size/tab_width
  • max_line_length

更新履歴

  • 2023-7-6
    • v3.0.0 で trailingComma のデフォルト値が es5 から all に変更
    • bracketSpacing 追加

GitHub Actions から git で commit & push

Update: 2022/4/13

actions/checkout/v3 の破壊的変更対応版

name: CI

on:
  pull_request:
    types: [opened, synchronize, reopened]
    branches:
      - main
    paths-ignore:
      - "docs/**"

permissions:
  contents: write
  pull-requests: write

jobs:
  setup:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repo
      uses: actions/checkout@v3
      with:
        fetch-depth: 0
        ref: ${{ github.event.pull_request.head.ref }}

    - name: Setup Node.js environment
      uses: actions/setup-node@v3
      with:
        node-version: 16

    - name: Setup development environment
      run: |
        npm install -g npm@8
        npm install

    - name: Commit updated files
      run: |
        git config core.filemode false
        if ! git diff --exit-code --quiet
        then
          git add -A
          git config user.name github-actions
          git config user.email action@github.com
          git commit -m "Commit updated files"
          git push
        fi

(以下は actions/checkout/v2 までの実装)

GitHub Actions で dotnet ef dbcontext scaffold した結果、差分があればそのまま commit しちゃいたいなーと思ったので。

- name: git commit & push
  run: |
    git config core.filemode false
    if ! git diff --exit-code --quiet
    then
      git add --update
      git config user.name github-actions
      git config user.email action@github.com
      git commit -m "Commit by github-actions"
      git push https://${{github.actor}}:${{secrets.GITHUB_TOKEN}}@github.com/${{github.repository}}.git HEAD:${{github.ref}}
    fi
  • git config core.filemode false: ファイルのパーミッション変更を無視。
  • if ! git diff --exit-code --quiet: git diff で何らかの差分がある時のみ実行。標準出力は --quiet で抑制。
  • git add --update: バージョン管理対象のファイルで差分があったものを全てインデックスに追加。
  • ${{github.actor}}: ワークフローの実行を開始したユーザー。
  • ${{github.ref}}: ワークフローの実行をトリガーしたブランチまたはタグ。

Cake v0.24.0 released

2017/12/29にCake v0.24.0がリリースされました!公式ブログ記事を簡単に邦訳しましたので、以下に記載します。


Cakeチームとcontributorsからのささやかな休日の贈り物として、2017年最後のバージョンをリリースしました! このリリースには破壊的変更は含まれておらず、いくつかの改善、バグ修正および新機能が含まれています。

特筆すべき新機能は、Cakeスクリプトランナーに組み込まれたmoduleのbootstrappingです。これは、既に#tool#addinプリプロセッサーディレクティブで可能なように、ビルドスクリプト#moduleでライブラリーを指定することで、対象のmoduleをNuGetからダウンロードおよびインストールすることができます。

#module nuget:?package=Cake.UrlLoadDirective.Module&version=1.0.2

moduleはCakeの内部構造を変更・拡張することができるため、このbootstrappingはCakeスクリプト実行の前に実施する必要があることには注意が必要です。これは、通常のビルドスクリプトを実行する前に、引数として--bootstrapを渡してCakeプロセスを開始することで解決できます。

./cake.exe build.cake --bootstrap
./cake.exe build.cake

大きな改善として、Roslyn 2.6.1にアップグレードしたことにより、ビルドスクリプト中でC# 7.2がサポートされるようになりました。
そして、Cakeのcontributorおよびユーザーの方々に感謝します。Cakeはあなた方抜きでは存在し得ません!

本リリースのcontributor:

本リリースの詳細は以下の通りです。

本リリースで、私たちは33のissuesをcloseしました。

Features

  • #1950 Allow Cake modules to be bootstrapped by Cake in a pre-processing phase
  • #1833 NUnit: Add support for /labels
  • #1653 Add Before and After options to NUnit3Labels enum
  • #74 MSpec support

Bugs

  • #1957 Use working directory instead if initial script path for resolving tools directory in NuGetLoadDirectiveProvider
  • #1939 Bug - TypeExtensions.GetFullName doesn't handle nested types correctly
  • #1933 NuGetPackSettings.Properties does not support whitespaces.
  • #1930 The "out" parameters are not compiled properly.
  • #1915 Only set working directory on process runner if set in settings
  • #1889 XmlPoke ignores BOM encoding settings
  • #1874 NuGet script load: Do not add include for all cake scripts when include already specified

Improvements

  • #1968 Add interface for AssemblyVerifier so that it can be mocked
  • #1960 Update Roslyn to 2.6.1
  • #1955 ResultsDirectory is missing from DotNetCoreTestSettings
  • #1952 Add support for class/namespace/method arguments for XUnit2
  • #1946 Add option to pack files into the NuGet tool directory
  • #1943 Chocolatey package dependencies cannot be set using the ChocolateyPackSettings
  • #1936 Move to signing service v2
  • #1931 Allow passing a nuget.config as environment variable or in cake.config
  • #1924 Set UserAgent for in process nuget
  • #1922 GitVersion is missing AssemblySemFileVer
  • #1912 Support for DotCover Process Filter
  • #1910 MSBuild property values should escape carriage return and line feed
  • #1855 SignTool is not found with latest windows 10 SDK
  • #1796 Obsolete DotNetBuild and ultimately remove it
  • #1692 Log script compilation warnings and other diagnostics
  • #1522 The MSTest tool doesn't pick up the mstest.exe from Visual Studio 2017

Documentation

  • #1811 Add code sample to build system properties

Cake Intellisense in Visual Studio Code

2017/11/8にやっとCakeでIntellisenseが効くようになりました!公式ブログ記事を簡単に邦訳しましたので、以下に記載します。

Intellisense

もしかしたらもう気づいたかもしれませんが、CakeチームはVisual Studio CodeでCakeファイルを編集中にIntellisenseが効くよう開発をおこなってきました。今日、OmniSharpが私たちのプルリクエスト(#932および#1681)をmergeし、Cakeのサポートを含むC# extension for Visual Studio Codeのv1.13.0がリリースされたことをアナウンスすることができ、大変嬉しく思います。これに加え、私たちはbakeryという新しいツールをリリースしました。これはスクリプト解析/コード生成ツールエンジンであり、CakeのIntellisenseを可能にしています。bakeryのより詳細な情報や、バックグラウンドで何が起こっているのかについては、後日ブログで紹介します。

How

どうやってIntellisenseを有効化するのでしょうか?それでは以下の手順に従ってください(Visual Studio Codeは既にインストール済みであると仮定します)。

  1. Visual Studio Codeを起動し、Cakeファイルの存在するフォルダへ移動します。
  2. C# for Visual Studio Codeのv1.13.0がインストールされていることを確認します。
  3. Visual Studio Code Extension for Cakeのv0.10.1がインストールされていることを確認します。
  4. Caketoolsフォルダにインストールされていることを確認します。addinが2回インストールされることを避けるため、v0.22.0以降を推奨します。最も簡単な方法は、.\build.ps1を実行することです。
  5. Bakerytoolsフォルダにインストールされていることを確認します。最も簡単な方法は、Visual Studio Code Extension for CakeのInstall intellisense supportコマンドを実行することです。コマンドパレットを開いて「cake」と入力し、当該オプションを選択してください。
  6. ここで、Visual Studio Code上で当該フォルダを閉じ、再び開く必要があります。
  7. Success! f:id:Intestine:20171112230349p:plain

Troubleshooting

Q: 上記手順を実行しましたが、Intellisenseが有効になりません。

C# Extension for Visual Studio Codeは、全ての*.slnファイルを検知し、omnisharp起動時にそのディレクトリを対象とします。もし*.cakeファイルが異なる階層に配置されていた場合、project selectorCakeプロジェクトを選択する必要があります。

Q: Cakeプロジェクトを選択しましたが、Intellisenseが有効になりません。

OmniSharp Logにエラーや警告が表示されていないかどうか確認してください。

[warn]: OmniSharp.Cake.CakeProjectSystem
    Cake script service not connected. Aborting.

上記のログは、Cake.Bakerytoolsフォルダにインストールされていないことを示しています。それに対して、以下のログは大抵の場合、Caketoolsフォルダにインストールされていないことを示しています(よりよいエラーメッセージに向けて修正中です)。

[fail]: OmniSharp.Cake.CakeProjectSystem
    c:\Users\mb\src\gh\bakery\setup.cake will be ignored due to an following error
    System.TypeLoadException: A null or zero length string does not represent a valid Type.

Q: エラーメッセージは表示されていませんが、それでもIntellisenseが有効になりません。

OmniSharp Logを表示し、Cakeに関係する箇所を探してください。もし適切にセットアップされていれば、少なくとも以下のようなログが表示されているはずです。

[info]: OmniSharp.Cake.CakeProjectSystem
    Detecting Cake files in 'c:\Users\mb\src\gh\bakery'.
[info]: OmniSharp.Cake.CakeProjectSystem
    Found 29 Cake files.

表示されていない場合、C#拡張機能v1.13.0のインストール時に問題が発生した可能性があります。拡張機能を一度アンインストールし、その後再度インストールしてみてください。その後、Windowsの場合は%userprofile%\.vscode\extensions\ms-vscode.csharp-1.13.0\.omnisharp\LinuxないしmacOSの場合は~/.vscode/extensions/ms-vscode.csharp-1.13.0/.omnisharp/を開き、OmniSharp.Cake.dllが存在することを確認してください。

Q: Intellisenseが有効になりましたが、その後追加したファイルが表示されません。

これはomnisharpの既知の問題であり、*.csxでも同様です。omnisharpチームとともに今後のリリースで改善されるよう取り組んでいます。

Q: Cake.CoreCLRtoolsフォルダにインストールされていればそれで充分でしょうか。

いいえ、現時点ではCake.CoreCLRではIntellisenseが有効になりません。

Q: 上記全てを試しましたが、まだIntellisenseが有効になりません。

Github上でbakeryリポジトリにissueを立てるか、Gitterで私たちにコンタクトをとってみてください。

Cake-Intellisence beta

※2017/11/07
C# Extension v1.13.0 beta5がリリースされたので、該当箇所を更新しました。

最近よく使っているCake。そろそろIntelliSenseが効くようになりそうです!
Visual Studio CodeのC# Extension v1.13.0からサポートされる予定ですが、現在beta5で動作確認できます。
以下、簡単な検証方法です(くれぐれも自己責任で!)。

Cake IntelliSence検証手順

  1. Visual Studio CodeのC#拡張を既にインストールしている場合はアンインストール。
  2. ここからcsharp-1.13.0-beta5.vsixをダウンロード。
  3. ダウンロードしたVSIXをインストール。
  4. Cake Extensionをインストールしていない場合はインストール。
  5. F1 → Cake: Install intellisence support
    /toolsディレクトリにCake.Bakeryがダウンロードされます。
    f:id:Intestine:20171103235243p:plain
    f:id:Intestine:20171103235235p:plain
  6. 対象の.cakeファイルを開き、Omnisharpと.NET Core Debuggerがインストールされるのを確認。
    f:id:Intestine:20171103235247p:plain
  7. 右下のSwitch projectsを選択。
    f:id:Intestine:20171103235306p:plain
  8. Cakeを選択。
    f:id:Intestine:20171103235303p:plain
  9. こんな感じでIntelliSenseが効くようになっているはず!
    f:id:Intestine:20171103235256p:plainf:id:Intestine:20171103235257p:plainf:id:Intestine:20171103235300p:plain

F12も使えます。 f:id:Intestine:20171103235229p:plain

いやーリリースが待ち遠しい!

Cakeビルド時エラー:Unknown token (2)

去年、Cakeビルド時のエラーについて触れました。

ビルド対象のプロジェクトのパスにマルチバイト文字が含まれているとエラーになります。 0.15.2まではうまくいってたんだけど、0.16.0からエラーになるみたい。

その後ソースを確認してみたところ、どうもTool(NuGet)を.cakeファイル内で読み込もうとすると、Globbingの際に一文字ずつこんな条件を満たすかどうかチェックしてるっぽい。

new Regex("^[0-9a-zA-Z\\+&%!@(). _-]$", RegexOptions.Compiled).IsMatch(character.ToString())

パスに使えない文字だけをホワイトリスト方式で検出するようにPR送ってもいいけど、対策見つけたんでちょっと保留。

対策

.cakeファイル内に#tool nuget:?package=NUnit.ConsoleRunner&version=3.4.0と書いてNuGetパッケージを読み込むのではなく、toolsディレクトリ内にpackages.configを置いてこんな感じに書いておく。

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="Cake" version="0.19.3" />
    <package id="NUnit.ConsoleRunner" version="3.4.0" />
</packages>

そうすると、bootstrapperを走らせた時にNuGetパッケージも復元してくれるので、パスにマルチバイト文字が含まれていてもビルド時にエラーにはならない(参考)。
マルチバイト文字なんか使わないのが一番なんだけど、リポジトリの都合上仕方がない場面もあるかと思います。そんな時は、bootstrapperでNuGet復元するようにしましょう。