銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Visual Studio 拡張(VSIX)用のプライベートリポジトリを作ろう

最近 Visual Studio拡張ツールの開発にはまっているのですが、パブリックに公開したいものであれば Products and Extensions for Visual Studio で公開するのがお手軽ですし、ダウンロードもしてもらえます。しかし、時には社内にのみ配布したい拡張もあるでしょう。特に、Visual Studio 2015 と C# 6.0 Roslyn で、Code Analyzer や Code Refactoring が作れることによって、よりVS拡張を作る機会が増え、社内向けプライベート VSIXリポジトリの需要が増えるかもしれません。

というわけで、今回はさくっと社内向けプライベートVSIXリポジトリを作ってみました。

内容としては、以下のMSDNやMSDNブログで紹介されている内容です。

blogs.msdn.com

https://msdn.microsoft.com/en-us/library/hh266746.aspxmsdn.microsoft.com

共有フォルダや、Sharepoint のサイトによる公開もできるのですが、ダウンロードできるVSIXの一覧を作成する必要があるので、普通のASP.NET MVC なWebアプリとして作るみることにしましょう。VSIX自体も別のStorageに置くのではなく、Webサイトが動くサーバー上のファイルシステムに直置きすることにします。

まず、VSIXの一覧をAtomフィードで作成する必要があるのですが、フィードの作成に必要な情報を別途管理するのではなく、直置きされたVSIXファイルを読みこんで作成することにしました。

gist.github.com

コードはC# 6.0で書いてます。 説明はコメントに書いてある通りです。面倒な点としてフィードに記述する情報はすべてがVSIXが読み取れるわけではなく、カテゴリやVSIXの作成・更新日時は別途リポジトリで管理しないといけません。今回、カテゴリは決め打ち、作成・更新日時はファイルの更新日時で代用しています。

途中でてくる、 PackageManifest や feed・feedEntry といったクラスはXMLをC#のクラスに対応させたもので、サンプルのXMLを Visual Studio に「Paste XML as Classes」で張り付けて作成したものになります。gist のリンクだけを貼っておきますが、面倒なのでクラス名が小文字で始まっているままになっています。

Models.cs

最低限これだけがあれば、Visual Studioにフィードを登録できます*1。Webサイトに PackagesBin というフォルダを作り、そこにVSIXを入れておけばフィードが作成されます*2

f:id:tanaka733:20150404224901p:plain

ちなみに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を追加するたびにサーバー上のフォルダに配置すれば動くんですが、まああれなのでアップロード機能もさくっと追加してみましょう。

gist.github.com

gist.github.com

これで、 ~/Packages にアクセスするとフォームが表示され、VSIXを選択して送信すると PackageBin 以下に保存してくれます。

もうちょっと真面目にやるなら、アップロード側の認証だったり*3、リポジトリの削除機能だったり、バックアップ機能があったりしてもいいかもしれません。

ちなみに、 Nuget だと Nuget.Server というNugetライブラリがあって、これをASP.NET MVCなWebアプリに追加するとすぐに使えるようになっています。

www.nuget.org

*1:登録の仕方は最初のMSDNブログにあります

*2:例外処理とかしてないので、不正なVSIXがあると落ちる

*3:クライアント側はVSの機能で制限される