nugetの社内利用のススメ
DESCRIPTION
Hokuriku.NET Vol.11の同名のセッションで使用したスライド資料ですTRANSCRIPT
NuGet の社内利用のススメ
きよくら ならみ
Hokuriku.NET vol.11
2013/01/26
自己紹介
• ハンドル:「きよくら ならみ」• @kiyokura
• 岡山生まれ岡山育ちのプログラマー• 現在は県内の某製造業で社内 SE
• NET 系の開発や Web アプリ開発• Microsoft MVP for ASP.NET/IIS
コミュニティ等
• Okayama IT Engineers Community
• 運営メンバー
• 主に MS 系のテクノロジを扱う
• 3/16 に岡山で、ヒーロー島さんと合同イベント• 日本マイクロソフトより、某緑の方が登壇予定!
• ASP.NET や Azure 系でご登壇いただける方を絶賛募集中です!
本日のアジェンダ
• NuGet ってなんだろう?
• 基本的な特徴と利用法
• 様々な機能
• 社内利用のススメ
NuGet ってなんだろう?
NuGet とは?
• .NET 用のライブラリ・パッケージ・マネージャ
• 読み方• ネイティブの人の発音は「ニューゲット」
• 日本人的には「ヌゲット」
ライブラリ パッケージ マネージャ
• ライブラリのパッケージをいい感じに管理するツール
• 導入や更新、依存関係の管理などなど
• 他の例だと…• Ruby の Gems, 古くは Perl の CPAN など
Q :ライブライをどうやって管理する?
• プロジェクトに DLL を直接取り込む?
• PC にインストールする?
例
• フリーのロギングのライブラリ、 log4netを使いたいと思った時の例• ( 「何で log4net ?」と思うかもしれません
が、たまたまなのでお気になさらず)
どこからとってくるんだっけ?
• とりあえずググ Bing って、反射的にトップにある記事をクリック
どこかリンクはないかな…
• それっぽいのを見つけてクリック
えっと、 log4net は…
• あったあった。
ダウンロードはどこから…?
• どこからおとすねん…あ、これか
だからどこやねん…
やっと落とせた…って、
• … で、どれを使えばいいの??
なんかそれぞれのフォルダに dllがあるんだけど…
いろいろ面倒なことがありませんか?
• DLL のバージョン管理
• 依存関係の管理
• 関連する設定は何か必要?
• バージョンの衝突
• DLL Hell
これらの問題を解決するためのもの• ライブラリ パッケージマネージャとは、
これらの問題をいい感じにするためのもの
• さらに NuGet ならではの機能や特徴も
ちなみに… NuGet でやるとこんな感じ
• 利用するプロジェクトでマネージャを起動
log4net を検索
• 見つかった!ので、インストール!
あっという間にインストール完了
適切な dll をプロジェクトから参照
• 自動的に設定完了
基本的な特徴と利用法
NuGet の代表的な特徴
• Visual Studio との統合
• インターネット上のギャラリーの利用
• 基本的な管理機能
• ソリューション間での独立性の確保
• 独自のライブラリのサーバの設置可能
• .NET 開発での標準的なツールに
Visual Studio との統合
• Visual Studio に統合された環境で利用できます• VS2010 … 拡張機能としてインストールする
• VS2012 … 標準でインストールされている
• GUI と CUI
• GUI により直感的に操作可能
• 細かな操作は PowerShell による CUI で操作
GUI と CUI
インターネット上のギャラリーの利用
• 公式の NuGet Gallery からソリューションに直接取り込み
• NuGet の GUI/CUI から直接検索・指定して操作
• 自作パッケージを Gallery に登録して公開することも可能
基本的な管理機能
• パッケージの取込・更新・削除
• パッケージ間の依存関係も自動で解決• バージョン単位で依存を管理・解決
バージョン単位での依存解決
• 『ライブラリ A Ver1.0 』が『ライブラリB Ver.1.0 』に依存し、
• 『ライブラリ A Ver2.0 』が『ライブラリB Ver.1.5 』に依存する場合、
• 『ライブラリ A 』を 2.0 にバージョンアップする操作をすると、自動的に『ライブラリ B 』も 1.5 にバージョンアップ
ソリューション間での独立性の確保• NuGet の管理の対象はソリューション or
プロジェクト単位
• ソリューション外で影響を与えない• DLL HELL の防止
• 目の前のソリューションのことだけを考えて、ライブラリの選定やバージョンアップを行うことが可能
独自のサーバを簡単に設置可能
• 独自にギャラリーを設置可能• XML でカタログを返す Web サーバ
• Windows のファイル共有機能• 社内などではとても簡単に設置可能
• 社内標準ライブラリの管理にも利用可能
プライベートリポジトリ(配布サーバ)の作成
• 配布方法は大まかに 2種類• HTTP経由( Web サーバ)で配布
• 極論すると、 Web サーバなら何でも OK
•カタログを xml ( ATOM形式)で返す
• nupack のバイナリを返す
• これを簡単に実現する ASP.NET 製のアプリもある
• Windows ファイルシステムで配布• ローカルのファイルシステム上のフォルダ
•テストするときや、自分だけで使うときはこれで OK
• Windows のネットワーク共有も OK
•社内や部署内レベルだと、これが一番楽
サーバへの配置
• Webの場合• 公開方法によって違う
• 手動でやる場合は面倒• カタログファイルを手動で更新したり…
• Windows ファイルシステムの場合• フォルダに nupack ファイルを配置すれば
OK !
.NET 開発での標準的なツールに
• Visual Studio の標準テンプレートでも利用されている
• Microsoft 自身も自社製ライブラリをNuGet で配布することが増えてきている
様々な機能
ざっくりとした仕組み
• 所定の形式のパッケージファイルを扱う• *.nupkg ファイル
• このパッケージは、以下を zip で固めたもの• ライブラリ本体
• マニュフェスト
• その他メタデータなど
自分でパッケージが作成できます
1.配布するライブラリの実体を用意
2.nuspec ファイルを記述
3.コマンドラインツールでコンパイル
• 以上で出来上がり!• hoge.1.0.0.0.nupkg というパッケージファ
イルが出来上がります
NuGet のさまざまな機能の概要
• マルチ・ターゲット
• 依存関係設定
• アセンブリ参照の追加
• 設定ファイル変換機能
• ソースコード変換機能
• スクリプト実行
マルチ・ターゲット
• 異なるフィーチャー / フレームワークバージョン向けのものを同梱して配布• 取り込んだプロジェクトごとに適切なバージョ
ンの DLL を自動的に参照設定する
• フレームワークのバージョンだけでなく、異なるターゲット向けの制御も可能• Silverlight向けと WPF向け等
依存関係設定
• 依存する別の NuGet パッケージ / バージョンを自動で解決
• バージョンは細かく指定が可能• 例:• 特定のバージョンのみ
• 特定のバージョン以下
• 特定のバージョン以上
• 特定のバージョン~特定のバージョンの範囲
アセンブリ参照の追加
• 配布するライブラリの動作に必要なアセンブリの参照を記述する• 例:配布する DLL が
Microsoft.VisualBasic.dll に依存する場合等
• ここで指定したアセンブリへの参照が自動的にプロジェクトクトの参照設定に追加される
設定ファイル変換機能
• Web.Config や App.Cofig に記述を追加する• マージさせるイメージ
• Configuration File Transformations 機能• 公式の翻訳が見つからないので勝手に訳してます
• 設定ファイルに転記したい内容のみを「 .transform 」という拡張子に記載する• いい感じにマージされる
• アンインストール時は同じ部分だけ削除される
ソースコード変換機能
• ソースファイルそのものを配布することも可能
• ただし、そのまま配布しても通常は問題がある• 名前空間などを差し替える必要がある
• Source Code Transformations 機能を利用すると、簡単に解決可能
• 拡張子 .pp を付けて、差し替えたい部分をプレースホルダで置き換える
namespace $rootnamespace$.Models { public class CategoryInfo { public string categoryid {get; set;} public string description {get; set;} }}
ASPX ファイル等も対象にできる
• ASPX ファイル等でも可能<%@ Page Title=“共通ログイン " Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind=“Login.aspx.cs" Inherits="$rootnamespace$.Login" %>
スクリプト実行
• PowerShell のスクリプトを記述し実行させることが可能• インストール時、アンインストール時それぞれ実行可能
社内利用のススメ
これらの機能を利用すると…
• 社内でのライブラリ管理
• ライブラリの管理だけでなく、様々なプロジェクト標準などを使いやすく(守りやすく)できるかもしれません
• ファイルサーバの○○からとってきてプロジェクトに入れといて
• ×× に書いてあるから、コピペして必ず転記しておいて
• □□を使うときは、絶対に「 hogehoge 」って名前のクラスにすることになってるからね!!
NuGet でエレガントに解決!!
… できるかも??
カスタムテンプレート的に利用する例
• 機能を色々組み合わせて簡易カスタムテンプレートとして• プロジェクト標準のフォルダ構成を配布
• ダミーのファイルを配布することでフォルダ構造を配布する
• 任意のパッケージの利用を強制する• 本来依存していないパッケージを依存関係に記載する
• 任意の記述を設定ファイルに記載する• 社内 DB 参照のための記述など、お決まりの記述
• 必ず使う名前のローカル実装クラスのテンプレートの配布• 例:社内標準のログインフォームなど
本来のカスタムテンプレートと使い分け
• ぞれぞれのメリットを考えながら• プロジェクトテンプレートとしてはカスタムテ
ンプレートのほうが行き届く
• 更新の配布などは NuGet のほうがカジュアルで楽、等
その他に実際やってる事
• NuGet パッケージとして配布されていないパッケージを勝手に NuGET で社内配布• ファイルサーバにおいて「このバージョンを
使って!」ってやってる部分をシステマチックにしただけ
• ライセンスに注意。• 特に有償コンポーネント
• もっと黒いことも…• あるけどここでは割愛
まとめ
NuGet は便利です
• .NET 開発においてもはや標準のツールといって過言ではない
• 便利なので、 NuGet Gallery で公開されているライブラリを使うなら、 NuGet を使わない手はない
プライベートリポジトリが便利
• 社内ライブラリの管理・運用もとっても楽になる
• 工夫次第で有効に使える場面が色々ありそう
御清聴ありがとうございました