kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

.NET 10 + VS Code で dotnet workload repairが失敗する現象を直した(Copilotが)

少し前からmacOS 26.2+.NET 10の環境でdotnet workloadコマンドが動かなくて困っていました。repairコマンドを実行してもダメ。さすがに困ってきたので、直してもらった記録。

3行まとめ

  • sdk-manifests / metadata/workloads / packs をリセットして再構築した
  • VS Code(C# Dev Kit)は dotnet を自前で管理している(既定の動作)ので、 .NET Install Tool の existingDotnetPath で dotnet を固定
  • Prune data エラー直すために SDK の再インストール

前提として私はHomebrewで.NET SDKをインストールしています。

現象

Workload が壊れて dotnet restore 以前にエラーが出ていました。

dotnet workload list
# -> Unhandled exception:
# Workload manifest microsoft.net.workload.emscripten.current ...
# was not installed.

dotnet workload repair を実行しても同じメッセージが出て直らない、という状態です。

いろいろ削除

# Workload の manifests を削除
sudo rm -rf /usr/local/share/dotnet/sdk-manifests

# Workload の状態(メタデータ)を削除
sudo rm -rf /usr/local/share/dotnet/metadata/workloads

# 展開済み pack を削除(確実に掃除)
sudo rm -rf /usr/local/share/dotnet/packs

# ユーザー側にもあれば削除(無くてもOK)
rm -rf ~/.dotnet/metadata/workloads 2>/dev/null || true
rm -rf ~/.dotnet/sdk-manifests 2>/dev/null || true

workloadが格納されているフォルダーをきれいさっぱり削除してから再構築。

sudo dotnet workload clean
sudo dotnet workload update --from-previous-sdk
sudo dotnet workload repair

これで`dotnet workload```コマンドがエラーにならなくなりました。次はVS Codeです。

VS Codeの.NET Tool Install拡張機能がエラーになる

VS Codeで.NETのプロジェクトを開くとこんな意味のエラーが出ます。

  • Microsoft.NET.SDK.WorkloadAutoImportPropsLocator を解決できない
  • 古い Workload version を参照して emscripten.current が無いと言う
[error] プロジェクト '/Users/(略)/tests/Tests.csproj' を読み込めませんでした。
One or more errors occurred. (SDK リゾルバー エラー:
"SDK "Microsoft.NET.SDK.WorkloadAutoImportPropsLocator" を解決しようとしているときに、SDK リゾルバー "Microsoft.DotNet.MSBuildWorkloadSdkResolver" に失敗しました。
例外: "System.IO.FileNotFoundException: ワークロード バージョン 10.0.100.1 のワークロード マニフェスト microsoft.net.workload.emscripten.current: 10.0.100/10.0.100 がインストールされませんでした。
"dotnet workload repair" を実行すると、これを解決できる場合があります。

VS Code(Insiders)の Settings (JSON) を開いて、以下を追加します。

{
  "dotnetAcquisitionExtension.existingDotnetPath": [
    { "extensionId": "ms-dotnettools.csharp", "path": "<DOTNET_ROOT>/dotnet" },
    { "extensionId": "ms-dotnettools.csdevkit", "path": "<DOTNET_ROOT>/dotnet" },
    { "extensionId": "ms-dotnettools.vscode-dotnet-runtime", "path": "<DOTNET_ROOT>/dotnet" }
  ],
  "dotnet.autoSdkDownload": false
}

<DOTNET_ROOT>にはdotnetコマンドのフォルダーを指定してください。設定後、VS Codeを再起動すれば読み込めるはずです。キャッシュが残っている場合は消しておくとより安全です。

rm -rf "$HOME/Library/Application Support/Code - Insiders/User/globalStorage/ms-dotnettools.vscode-dotnet-runtime"
rm -rf "$HOME/Library/Application Support/Code - Insiders/User/globalStorage/ms-dotnettools.csdevkit"
rm -rf "$HOME/Library/Application Support/Code - Insiders/User/globalStorage/ms-dotnettools.csharp"

prune package dataが見つからない問題を直す

(<REPO>/<PROJECT>.csproj): パッケージの排除データが見つかりません。.NETCoreApp 10.0 Microsoft.NETCore.App
(<REPO>/<PROJECT>.csproj): パッケージの排除データが見つかりません。.NETCoreApp 10.0 Microsoft.AspNetCore.App
このエラーを無視するには、AllowMissingPrunePackageData を true に設定してください。

参照パッケージが正しく入っていないときにこのエラーになるそうです。

面倒なので、homebrewのパッケージを再インストールしました。

brew reinstall --cask dotnet-sdk

おわりに

昔はこういうトラブル起きると、エラーログ使っていろんなサイト検索して一つずつ解決していましたが、生成AIのおかげで一発でまとめてくれて助かりますね…。

何回実行しても特定の時間まで実行しないアプリランチャー

ほとんど毎日の作業としてこんなものがあります。

  1. Windows Terminalを起動する(スタートアップ起動)
  2. winget実行してアプリケーションを最新にする
  3. npm installを(同上)
  4. dotnet global packageを(同上)
  5. PowerShellのパッケージを(同上) ....

シェルのヒストリーがあるとはいえ、まぁまぁめんどくさい。バッチにして、Terminalのタブ起動時に実行してもいいけど、空振りすることがわかっているのに実行されるのもちょっと嫌だなぁ、と思っていたらはせがわようすけさんがこんなことを書かれていました。

そうだよなぁ、まさにそうと思って簡単なツール作ってみるか?とGitHubにレポジトリ作ったのがこの後すぐ…だけど、めんどくさくなってきて(笑。ほかにもやることあったし)、長い間放置していました。

当時からRustもあり、勉強がてらいいかな?と思ったけど、C/C++のほうがわかるし別に起動してすぐ終わるツールだからC++でいっかと思ってつくりはじめたものの、時間とられすぎて放置していたのです。でもやっぱり面倒になったところに出てきたのがGitHub Copilot(とエージェント)。コード補完やAskしかなかった頃は「違うそうじゃない」と思って、やはりあきらめたのです。

しかし、GPT-5以降のモデルの利用やAgentモードになって自分が作るよりも立派なものをより早くできるようになったので冬休み頑張って仕上げました(Copilotが)。Coding Agentは今のところUbuntuで動いていたので、WindowsのC++は駄目だろう?と思っていたのですがビルドは当然してくれないものの、コンパイルエラーにならない程度のものを作ってくれてびっくりでした。

あとはローカルのVisual Studioで仕上げます。最初「GoogleTestとcmakeがデファクトだよ」と言われて(Ubuntuで動いていたのもあったのでしょうが)、そのまま承諾していたらローカルでGoogleTestがさっぱり動かない。DLLがないっぽいのですが、ちょっとわからなかったし動かせる自信もモチベーションもなかったので、MicrosoftのC++ Testing Frameworkに変えて、cmakeもやめました(のでコミット記録が結構残っています)。この辺の変更もAgentにやってもらいました。

この辺は最初にちゃんとカスタムイントラクション作らなかったのがいけなかったかな、と反省しています。

あと、レポジトリのルートにあるreadme.mdをVisual Studioが認識しない?っぽいのでそこも結構困る。いぜんかずきさんが似たこと(.NETのプロジェクト)で困られていて、「GitHubにあるものであれば大丈夫そうだ」と書かれていましたが、C++のプロジェクトでは認識していないようにも見えます。この辺は要調査。

とまぁ長々と書きましたが、Copilotのおかげで割と自分が納得いくツールになったと思うので良ければ使ってください。wingetへの登録も後ほど…。Visual Studio 2026使っているのにツールセットが2022なのはGitHub Actionsのhosted runnerにVisual Studio 2026が入っていないからです。

github.com

最初はNTFS代替ストリームに最終実行時間を書こうかなとか思っていましたが、起動パラメータとかjsonにするんだからjsonでもいいかと思いなおしました。200KB程度の小さいバイナリーにしましたが、できれば100KB程度にしたかった。

個人的2025年振り返り

イベント関係

4月から会社の役職が変わったこともあって、ちょっと準備時間取りづらくなりました。今まで以上に効率的に取捨選択しないといけないですね。

  • 定期的にやっている devblog ラジオ。隔週金曜の22時に雑談メインです。
  • 不定期にやっているCollaboHubで第一回が…インフルエンザにかかって断念。第二回あるのでよろしく
  • 9月に AI Tour Osakaでブースに立ってお手伝い。AI と App Devの話でしたけど、AIの相談はすさまじい勢いでした。これ11月のIgniteの後だったらどうだったのかと思うくらいです。世界ではIgniteの直後にAI Tourやっている国もあるので、大変だったんだろうなと。
  • 11月に初めてのIgnite現地参加。楽しくはありました。
  • すきやねんAzureでも確か2回ほど…
  • AI駆動開発の大阪支部のキックオフのときちょうどGitHub Coding Agentがリリースされたのでその話とか

買ったもの

MicronのCrucialブランドの撤退でいろいろ目論見が狂いましたね。少なくとも来年はDDR5のメモリとかSSDとか辛そう。たぶんだぶついたものが放出されるのではないかなぁと思ってはいますが…。

  • サーバー移行のパーツ一式。Core i5 Gen 14のCPUでしたが、買ってよかったなとつくづく思いました。RMAで交換されたメモリも来たので、128GBにできるから何とかいろいろ遊べそう
  • iPhone 17 Pro Max。2年に一度買い換えているので
  • NEC Aterm MR51FN。便利ではあるのですが、バッテリー取り外した運用できないのがなぁ。競合のやつはできるものがあるので、そっち買えばよかったかなとちょっと後悔しています。ASUSのルーターと組み合わせて使おうとしたら変更箇所が多いのでもう少し何とかならんかな。
  • ASUS RT-BE3600 Go。まぁちょうどこういうのほしいと思っていたのです。一応ポケットルーターあるのですが、性能的にちょっと不満というか、ホテルなどでは使いたいケースがあって。
  • Galaxy A36。FOMAが終わってしまうので。長期契約者向けにはA25ただでくれる、というオファーがあったのですが、20年くらい使っている人にA25ってなぁ…もう一息ということで、A25は子供に譲りました。
  • Logicool M575SP。トラックボールはやっぱ便利ですね。
  • Lofree Flow2, Flow Lite(いずれも84 Key)。Flow2はかなり気に入っています。
  • Adobe Creative Cloud。Adobeのモデルは正直…ですが、Nano Bananaをはじめとする他社のモデルも使えるので、これでいいかと思っています。編集は便利ですしね。
  • keychron B2 Pro…キーボードばっかり買ってますね。これは出張に会社のPCをもって行かないといけない時用。薄くて軽くて非常に気に入っています。
  • スマホスタンドとPCスタンド。UGREENのものを気に入って使っています。どちらも今まで必要性を認めていなかったのですが、使うとコロッと意見が変わりますね。

技術を振り返って

AIというか、コーディングエージェント抜きにしては語れないでしょうね。Devinなどが先行していましたが、5月末にGitHub CopilotがCoding Agentを提供したことで、今まで作りたいものがあっても時間の都合であきらめていたものが隙間時間で作れるようになってしまいました。

実は最初のころCoding Agent試して使わない時期があって「なんで使わなくなったの?」とGitHubからフォローアップのメールが来るくらいでしたが😉単にローカルのAgentモードでもいいじゃんと思っていたのと、hosted Runnerの無料時間をとかすこと、Premium Requestの使用量がわからなかったからです(現在はだいぶわかりやすくなりました)。でもやはりissueに書いてCopilotにアサインすればいいのは楽ですね。

冬休みの間に作りたいものはあるので(完全に自分専用です)、何とか一つ作ろうと思います。

2026年

AIサービスそんなに使っているわけではないですが、破産しない程度に課金して活用していくつもりです。スライドとかアイディアは出してもらいますが、どうもまだAIに全部作ってもらうというのに慣れなくて、スライドとかそういうものはまだまだ自分で作ろうかなと。でも下書き作ってもらうのは楽なので、これからも使っていくつもりです。

OpenAI, Anthropic, Googleの三つ巴みたいな感じですね。あっちこっち試す時間はないので、OpenAIとAnthropicを…GitHub CopilotとMicrosoft 365 Copilotから使っていくつもりです。ではよいお年を。

Azure DevOpsの2025年振り返り

この記事はAzure DevOpsアドベントカレンダー25日目の記事です。

qiita.com

いつも書いているまとめ的な奴ですね。Copilotにもまとめさせてみましたが、やはり大きくは3つです。

  • セキュリティ強化
  • プラットフォームモダナイゼーション
  • GitHubとの相互運用強化

セキュリティ強化

リリースノートにセキュリティ強化という項目が出てこないときはないくらいセキュリティ強化が行われていました。Azure側ですが、Defender for Cloudのエージェントレススキャンも入りました。

OAuth アプリ新規登録停止(sprint257)や SNI 必須化(sprint257、CAE(継続的アクセス評価sprint 260対応など、地道に改良が続きます。

地味ですが、パブリックプロジェクトの廃止sprint 260も大きな出来事でした。GitHub買収後もう廃止するよなぁ、と思っていましたが、やはりその通りになりました。新規に作れなくなるだけで今あるプロジェクトはそのままのはずです。

EntraのOAuthスコープ、PAT作成ポリシーなどもsprint 257提供でした。

GitHub Advanced Security for Azure DevOpsも継続的に強化が行われました。ほとんどはGitHubへの追従(課金分離、対応言語やビルドレススキャンなど)ですが、Pull Request アノテーションsprint 251、Service Hook対応sprint 258などの強化も順調に行われています。Work Item関連付けsprint 264などの強化も入りました。

特にWork Item関連付けはリリースされた時から要望していたので、ようやく3年越しという感じです。DevSecOpsを「しぶしぶやる」ではなく、「やることが自然なワークフロー」へ移行しているようです。

プラットフォームモダナイゼーション

3年越しではありますが、ようやくAzure BoardsがReactベースの最新プラットフォームに移行しました。ちなみに前はjQueryだったはずです。私はプレビュー時点からずっと新しいほうのBoardでした。

TFVCもいいところはあるんですが、やはりGitの波には逆らえないというか、廃止が決まりました。もう新規では作れなくなっていますが、移行せざるを得ないようです。レポジトリへのアクセスはまだできますが、移行しましょう。

Managed DevOps poolという目新しいものもできました。これはMicrosoft内部で使われていたものが評判よかったので外部リリースにしたそうです。GitHubのAzure VNET Integrationと違って、VNET Peeringを使わない(VNETへの委任を使う)ので、安定とコストで有利なはずです。self host runnerでいつも付きまとうカスタムイメージ作成から解放されるのも大きいですね。VMSSよりも柔軟にスケジュール設定ができますし。

hosted agentもWindows Server 2025, macOS 15と更新されました。自動的に古いOSは廃止されます。クラウドサービスの宿命ですが、プラットフォーマーの変更には粛々とついていくしかないですね。

Test Plansも昨年4年くらいの眠りから覚めて改良がおこなわれ、今年はほぼ全部のsprintで何らかの修正が行われたのもびっくりです。Artifactsもよろしく。

Azure DevOps serverも年号が取れたものがリリースされました。これからは四半期に一度程度定期的にパッチリリースするのかな。最新環境への追従もやりやすくなるので、歓迎…となると思います。

GitHubとの相互運用

Copilotが唯一もらえないプロダクトだと思っていましたが、なんとCoding Agentが提供されました。割とGAまで早かったですが、Coding AgentそのものはGitHub側だからそんなに、ということなのでしょうか。Reposではなく、レポジトリはGitHubで管理しなくてはならないですが、チケットだけというところはまだまだあると聞いてますので、そういう人向けでしょうか。

それを反映するかのようにsprint 252で、GitHub Enterprise CloudユーザーにAzure DevOps Basicライセンスが提供されるようになりました。

あと、MCP Serverも一般提供開始されましたsprint 264。今までめんどくさかったsprintの設計とかいろいろMCP Server経由でできるようになってうれしいです。ツールの数は何とかならんかと思うのですが…Azure, Azure DevOps, GitHubとかやるともう128超えますし。

2026年に向けて

Copilotが提供されない(AI機能は直接組み込まない)ことはわかっています。多分ものすごいことが起きない限りこれは変わらないでしょう。でもやはりAIを組み込むポイントは欲しい(例えばBoardsのチケットをAIでリライトしてほしい)ので、そういうところでGitHub Copilot, GitHub Modelsなどを呼び出せるようになると嬉しいですね。

GitHub Advanced Securityもセキュリティが優先事項なので継続的に投資されると思います。ワンクリックで有効化できるようになったし、クエリパックももうちょっと書いていきたいですね。

GitHubにはいまだにテスト管理機能がないので、Test Plansも引き続き改良されそうで一安心です。PipelinesもGitHub ActionsはGitHubでしか使えないので、どちらでも使えるPipelinesはほどほどに機能強化が続くのではないかなと思います。Azure デプロイはPipelines楽なんですよ…認証とか。

今はセキュリティと両方やっていますが、本業(?)はやはり開発ライフサイクルなので、来年も引き続きよろしくお願いいたします。おそらく年明けしばらくしてsprint 267出るのかなと思っています。