最近 Visual Studio拡張ツールの開発にはまっているのですが、パブリックに公開したいものであれば Products and Extensions for Visual Studio で公開するのがお手軽ですし、ダウンロードもしてもらえます。しかし、時には社内にのみ配布したい拡張もあるでしょう。特に、Visual Studio 2015 と C# 6.0 Roslyn で、Code Analyzer や Code Refactoring が作れることによって、よりVS拡張を作る機会が増え、社内向けプライベート VSIXリポジトリの需要が増えるかもしれません。
というわけで、今回はさくっと社内向けプライベートVSIXリポジトリを作ってみました。
内容としては、以下のMSDNやMSDNブログで紹介されている内容です。
https://msdn.microsoft.com/en-us/library/hh266746.aspxmsdn.microsoft.com
共有フォルダや、Sharepoint のサイトによる公開もできるのですが、ダウンロードできるVSIXの一覧を作成する必要があるので、普通のASP.NET MVC なWebアプリとして作るみることにしましょう。VSIX自体も別のStorageに置くのではなく、Webサイトが動くサーバー上のファイルシステムに直置きすることにします。
まず、VSIXの一覧をAtomフィードで作成する必要があるのですが、フィードの作成に必要な情報を別途管理するのではなく、直置きされたVSIXファイルを読みこんで作成することにしました。
コードはC# 6.0で書いてます。 説明はコメントに書いてある通りです。面倒な点としてフィードに記述する情報はすべてがVSIXが読み取れるわけではなく、カテゴリやVSIXの作成・更新日時は別途リポジトリで管理しないといけません。今回、カテゴリは決め打ち、作成・更新日時はファイルの更新日時で代用しています。
途中でてくる、 PackageManifest や feed・feedEntry といったクラスはXMLをC#のクラスに対応させたもので、サンプルのXMLを Visual Studio に「Paste XML as Classes」で張り付けて作成したものになります。gist のリンクだけを貼っておきますが、面倒なのでクラス名が小文字で始まっているままになっています。
最低限これだけがあれば、Visual Studioにフィードを登録できます*1。Webサイトに PackagesBin というフォルダを作り、そこにVSIXを入れておけばフィードが作成されます*2。
ちなみにDL処理ですが、ファイルが存在しているのであれば(最低限PackageBinというフォルダがあれば) ~/PackageBin/hogemoge というリクエストに対しIIS側で静的ファイルを返すように処理してくれます。ただ、 vsix という拡張子がMIMEになくてエラーになるので、以下の記述を Web.config のConfiguration要素の子として追加しておきましょう。
<system.webServer> <staticContent> <remove fileExtension=".vsix" /> <mimeMap fileExtension=".vsix" mimeType="application/octet-stream" /> </staticContent> </system.webServer>
これだけでも、VSIXを追加するたびにサーバー上のフォルダに配置すれば動くんですが、まああれなのでアップロード機能もさくっと追加してみましょう。
これで、 ~/Packages にアクセスするとフォームが表示され、VSIXを選択して送信すると PackageBin 以下に保存してくれます。
もうちょっと真面目にやるなら、アップロード側の認証だったり*3、リポジトリの削除機能だったり、バックアップ機能があったりしてもいいかもしれません。
ちなみに、 Nuget だと Nuget.Server というNugetライブラリがあって、これをASP.NET MVCなWebアプリに追加するとすぐに使えるようになっています。