Azure Pipelines の「Project file(s) matching the specified pattern were not found」:dotnet のタスクがプロジェクトを見つけられない
.NET のタスク(DotNetCoreCLI@2)は、Path to project(s) の入力(projects)の各行をパターンとして $(System.DefaultWorkingDirectory) の下で探し、ファイルの一覧にします。一覧が空だと、build・publish・run・custom のコマンドはこのメッセージで止まります(restore は同じ理由で No files matched the search pattern. で失敗します)。パターンは表示されないので、タスクに何を渡したかを見ます。多いのは、存在しない変数、逆スラッシュ、違うフォルダーから書いたパスです(このメッセージについての Stack Overflow の質問は4万2千回以上見られています)。
そのビルドがプルリクエストのビルド検証なら、タスクがプロジェクトを見つけるまで必須のビルドは失敗のままです:JetBrains IDE のプラグイン Azure DevOps Pull Requests は、そのプルリクエストのブランチ ポリシーを状態つきで IDE に並べ、Pro ならパイプラインを直したあとで失敗したビルド ポリシーをそこからもう一度動かせます。JetBrains Marketplace で入れる
どう見えるか
##[error]Project file(s) matching the specified pattern were not found.。後ろにパターンは付きません。command: publishでは、前にNo web project was found in the repository.が出ることがあります。下の publish の節の場合です。command: testでは同じ文が警告として出て、テストを1つも動かさずにステップが通ります。テストのステップが緑でも、テストが動いた証拠にはなりません。
何も定義していない $(Parameters.projects)
- クラシックのエディターから書き出したパイプラインや、その .NET のテンプレートから始めたものには、よく
projects: '$(Parameters.projects)'があります。クラシックのエディターではプロセスのパラメーターでしたが、YAML では何も定義しておらず、知らないマクロは書いたまま残り、$(Parameters.projects)という名前のファイルはありません。projects: '**/*.csproj'のように、パターンそのものを書きます(いちばん読まれている質問と、publish の質問で採用された回答)。
Linux のエージェントでの逆スラッシュ
**\*.csprojは Windows のエージェントでは動きますが、ubuntu-latestでは何にも当たりません。どちらでも動くスラッシュの**/*.csprojを使います(同じ質問でいちばん票の多い回答。Windows 向けに書かれた手引きを写していました)。
パターンはリポジトリのルートから
- タスク自身の説明のとおり、パターンは Working directory に関係なく、リポジトリのルートから探されます。プロジェクトが
src/Api/Api.csprojなら、workingDirectory: src/ApiとApi.csprojではなく、src/Api/Api.csprojか**/Api.csprojと書きます。 - クラシックのリリースや、アーティファクトしか持たない後のステージでは、
$(System.DefaultWorkingDirectory)にあるのはダウンロードしたアーティファクトで、ソースではありません。探すプロジェクトのファイルがありません。ビルドと公開はビルドのステージで行い、その出力をデプロイします。 - リポジトリにソリューションがあるなら、
projects: '**/*.sln'で中のものをまとめてビルドできます(回答)。
publishWebProjects がオンの publish は projects を無視する
command: publishでは、Publish web projects(publishWebProjects)が既定でオンです。するとタスクはprojectsを無視し、Web のプロジェクトを自分で探します。web.configかwwwrootのフォルダーが横にある.csproj・.vbproj・.fsproj、またはMicrosoft.NET.Sdk.Webの SDK を使うものです。- コンソールのアプリ、ワーカー、Azure Functions のプロジェクトは、この判定では Web のプロジェクトではないので、何も見つかりません。
publishWebProjects: falseにして、projectsにプロジェクトを書きます。
複数のプロジェクト、または一部を除く
- この入力は1行に1つのパターンを受け取ります。コンマやセミコロンで区切った一覧ではありません。除くものは
!で始め、絞り込む相手のパターンの後に置きます:projects: |**/*.csproj!**/*.Tests.csproj
(Stack Overflow の回答。一覧を変数に置くなら複数行の変数にする:別の回答)。 - 確かめるには、タスクの前に
- script: find $(System.DefaultWorkingDirectory) -name '*.csproj'(PowerShell ならGet-ChildItem -Recurse -Filter *.csproj)を置き、出たパスとパターンを比べます。タスクのリファレンスのページも参照してください。
IntelliJ IDEA と Rider で Azure DevOps のプルリクエスト
Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。組織・プロジェクト・リポジトリを git のリモートから読み、自分のレビューを待っているプルリクエストを IDE のツールウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも使えます。プルリクエストのブランチ ポリシーを状態つきで並べるので、まだ通っていない必須のビルドがそのプルリクエストの横に出て、Pro なら失敗したか期限が切れたビルド ポリシーをそこからもう一度動かせます。レビューの受信箱は無料、投票・コメント・完了・作成は Pro(30日間の無料試用つき)です。画面は日本語です。
Azure DevOps・Azure Pipelines は Microsoft Corporation の商標、GitHub は GitHub, Inc. の商標、IntelliJ IDEA・Rider は JetBrains s.r.o. の商標です。このページは Microsoft・GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:restore が Unable to load the service index for source で止まる · 公開のステップが、ないパスを指している · デプロイのタスクが探すところに zip がない · Failed to deploy web package の後ろのコード · English