Git にコマンドラインでチェックインする

例えば GitHub の場合、GUI ツールである GitHub for Windows を使えば、
直感的な操作でリポジトリを管理することができます。

GitHub for Windows

 

基本的にはこのような GUI ツールを利用するのがよいと思いますが、
それでもやはり、チェックインの頻度が高くなるほどバッチなどをあらかじめ作っておいたほうが楽になるでしょう。
以下では、コマンドラインで Git リポジトリを操作する方法について記述します。

 

■ ローカル キャッシュ フォルダーを作成する

まず初期準備として、新規に作成したリポジトリや既存のリポジトリに対して、
ローカル キャッシュ (作業用のフォルダー) を作成するためのコマンドです。
これにより、リポジトリの最新のファイルもダウンロードされます。

git clone https://github.com/sakapon/Sample01 Sample01

最後の引数には、ローカル キャッシュとして使うディレクトリのパスを指定します。
上の例では、現在のディレクトリからの相対パスを指定しています。

 

■ ファイルのチェックイン (プッシュ)

ローカルのファイルを変更した後、次のコマンドを実行すればすべてのファイルをリポジトリにチェックインできます。

cd Sample01
git add –all .
git commit -m "This is comment."
git push -u origin master

最初の行では、ローカル キャッシュに移動しています。
git add コマンドで「–all」を指定することにより、ファイルの追加・更新だけでなく、削除も対象になります。
最後の「.」はすべてのフォルダー・ファイルを対象とすることを表します。

また Git では、コミットとプッシュの 2 段階の概念に分割されていますが、上の例ではまとめて実行しています。

 

なお、CodePlex の Git に対しても上記と同様の方法を使用できました。

参照
Git ユーザマニュアル (バージョン 1.5.3 以降用)
Gitコマンドリファレンス

広告
カテゴリー: ALM, ツール. タグ: . Leave a Comment »

プロパティ変更とエラー情報の通知 (概念編)

先にプロパティ変更とエラー情報の通知 (実装編) を投稿しましたが、
今回は通知のプログラミング手法について概念的に考えてみます。

まず、従来のいわゆる手続き的なプログラミング手法の場合で、次のようなコードがあったとします。

try
{
    // ある処理を実行する

    // ある処理の実行が完了した場合の処理
}
catch (Exception) // エラーが発生する
{
    // エラーが発生した場合の処理
}

この手続きの中に現れる処理を、観測者と被観測者の 2 つのオブジェクトに役割を分担させるように変更します。
そのためには、被観測者側のコードを次のようにします。

try
{
    // ある処理を実行する

    // ある処理の実行が完了したことを観測者に通知する (通知後の処理は観測者が知っている)
}
catch (Exception) // エラーが発生する
{
    // エラーが発生したことを観測者に通知する (通知後の処理は観測者が知っている)
}

ある処理を被観測者側で実行し、それが完了したら観測者に通知します。
観測者はその通知をトリガーとして何らかの処理を実行します。

これが Observer パターンで、この Wikipedia に載っている図と同様にクラス図を作ると次のようになります。

Observer パターン

 

通知後の処理を関数として渡せるようにするには、プログラミング インターフェイスを次のように変形します。

Observer パターン

 

.NET の場合、イベントを利用することができます。

Observer パターン

 

.NET ではとくに、データのエンティティなどに適用できるインターフェイスとして
INotifyPropertyChanged, INotifyDataErrorInfo が用意されており、
XAML 系テクノロジのデータ バインディングでは、これらを利用してプレゼンテーション層とモデル層における関心事を分離します。
つまり、アプリの本質的なロジックをモデル層に集中させ、プレゼンテーション層は同期的に追従して UI を更新する、
といったプログラミング スタイルを実現できます。

なお、プログラミング インターフェイスの変更については、
Reactive Extensionsの概要と利用方法にも同様の議論が記載されています。

参照
プロパティ変更とエラー情報の通知 (実装編)
Observer パターン
Reactive Extensionsの概要と利用方法

プロパティ変更とエラー情報の通知 (実装編)

XAML 系テクノロジにおけるデータ バインディングは、
プレゼンテーション層とモデル層の間のデータ同期を自動化するプログラミング モデルを実現するための仕組みです。
バインディング ソース (主にモデル層のデータ) では、オブジェクト内で変化が起こった場合にそのことを通知します。

これは Observer パターンの活用例の 1 つです。
Observer パターンについては、プロパティ変更とエラー情報の通知 (概念編) に書きました。

以下では、主に MSDN ライブラリの資料をもとに、バインディング ソースを実装する際の注意点をまとめました。
大きく、プロパティ変更通知とエラー情報通知に分けられます。

 

■ プロパティ変更通知

オブジェクトのプロパティの値が変更される・されたことを通知するには、
INotifyPropertyChanging インターフェイス (プロパティ変更前) および
INotifyPropertyChanged インターフェイス (プロパティ変更後) を実装します。
INotifyPropertyChanging インターフェイスの実装は省略されることもあります。

これらのインターフェイスでは PropertyChanging イベントおよび PropertyChanged イベントを実装することになりますが、
イベント引数の PropertyName には、変更されたプロパティの名前を指定します。
ここで null または空文字列を指定すれば、オブジェクトのすべてのプロパティが変更されたという意味になります。
ただし、実際には null はあまり使わず、空文字列を使うことが多いようです。

以前は、プロパティ内でこれを実装するためにプロパティ名の文字列をコードに埋め込んでいましたが、
.NET Framework 4.5 または Windows ストアでは CallerMemberName 属性を利用することで回避できます。

public class Person : INotifyPropertyChanged
{
    private string name;

    public string Name
    {
        get { return name; }
        set
        {
            if (name == value) return;
            name = value;
            NotifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged = (o, e) => { };

    public void NotifyPropertyChanged([CallerMemberName]string propertyName = "")
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

 

⋄ コレクション変更通知

コレクションが変更されたことを通知するには、INotifyCollectionChanged インターフェイスを実装します。
自分で実装しなくても、ObservableCollection<T> クラスを利用すればほぼ十分です。

 

■ エラー情報通知

オブジェクトの中でエラーが発生したことを通知するには、INotifyDataErrorInfo インターフェイスを実装します。
主に、ユーザーからの入力値を検証する場合などに利用されます。
INotifyDataErrorInfo インターフェイスは Silverlight で先に登場しており、解説もこちらのほうが詳しく記載されています。

なお、以前から IDataErrorInfo インターフェイスがありましたが、
これは古い形式で、通知イベントが発生する形式にはなっていません。今後は使われなくなるでしょう。

さて、以下は INotifyDataErrorInfo インターフェイスの実装方法です。

内部でエラーが発生したら、例えば変数などにエラー情報をキャッシュしておき、ErrorsChanged イベントを発生させます。
プロパティ変更通知のときと同様、ErrorsChanged イベントの引数にはプロパティ名を渡します。
ここで null または空文字列を指定すれば、オブジェクトのレベルでエラーが発生したという意味になります。

そして GetErrors メソッドで、実際のエラーのコレクションを取得できるようにします。

HasErrors プロパティでは、エンティティ レベルにもプロパティ レベルにもエラーが存在しない場合に false を返します。
ただし、標準のバインディング エンジンに利用されることはないようです。
通常は、プロパティ名を指定できる ErrorsChanged イベントと GetErrors メソッドを使います。

INotifyDataErrorInfo.ErrorsChanged イベントの説明には、ErrorsChanged イベントを UI スレッドで発生させる、
と書かれていますが、Binding オブジェクトでデータ バインディングを設定してある場合には
UI スレッドでデータ ソースの値が取得されるため、UI スレッドでなくてもとくに問題はなさそうです。

以下は、その他の注意点です。

・GetErrors メソッドで INotifyCollectionChanged が実装されたコレクションを返す場合であっても、
    ErrorsChanged イベントを発生させる。
・GetErrors の戻り値の各アイテムに対して ToString メソッドを呼び出したらエラー メッセージを取得できる。
    例えば、ValidationResult オブジェクトを利用する。

 

INotifyDataErrorInfo インターフェイスの実装方法については以上ですが、
標準のバインディング エンジンの中核である Binding オブジェクトの設定の注意についても記述しておきます。

・ValidatesOnNotifyDataErrors プロパティ : INotifyDataErrorInfo のエラー検知をする場合。
・ValidatesOnDataErrors プロパティ : IDataErrorInfo のエラー検知をする場合。通常は使いません。
・ValidatesOnExceptions プロパティ : 例外を検知する場合。
・NotifyOnValidationError プロパティ : エラーを検知したときに、WPF の場合は UI 要素の Validation.Error 添付イベントを、
    Silverlight の場合は UI 要素の BindingValidationError イベントを発生させる。

これらのプロパティの既定値は、ValidatesOnNotifyDataErrors のみ true で、その他はすべて false です。
Silverlight の ValidationSummary などの一部のコントロールを利用する場合、
NotifyOnValidationError プロパティを true にします。

 

プラットフォーム
.NET Framework
Silverlight
Windows Phone
Windows ストア
Portable Class Library

参照
プロパティ変更とエラー情報の通知 (概念編)
INotifyPropertyChanged インターフェイス
INotifyCollectionChanged インターフェイス
INotifyDataErrorInfo インターフェイス
弱いイベント パターン

NuGet パッケージを作成して公開する

NuGet パッケージ (.nupkg) を作成して公開する方法について記述します。

 

■ 事前準備

  • NuGet Gallery アカウントの作成

NuGet Gallery でアカウントを作成します。
アカウントを作成すると、パッケージの公開に必要な API キーが発行されます。

  • ツール

NuGet パッケージを作成するには、次のいずれかのツールが必要です。
両方とも NuGet – Downloads で入手できます。

・NuGet.exe : コマンドライン ツール
・NuGet Package Explorer : GUI ツール

NuGet Package Explorer があれば、NuSpec ファイルや NuGet パッケージを手軽に作成できます。
ただし、バージョン アップなどで継続的に NuGet パッケージを作成するには、
コマンドライン ツールを利用すると便利です。
以下では、主に NuGet.exe で NuGet パッケージを作成する方法を紹介します。

 

■ Nuspec ファイルを作成する

NuGet パッケージを作成するには、DLL ファイルなどの配布物のほかに、
ID や作者などのメタデータを記述した Nuspec ファイルが必要です。
Nuspec ファイルは拡張子が .nuspec で、XML 形式のファイルです。

Nuspec ファイルのテンプレートは、

nuget spec

を実行すれば得られます。
このファイルに実際のメタデータの値を指定していきます。

Nuspec ファイルの仕様は Nuspec Reference に記述されています。
外部への参照やファイルの追加は、次のように指定します。

  • .NET Framework アセンブリへの参照

<frameworkAssemblies>
  <frameworkAssembly assemblyName="System.Web" />
</frameworkAssemblies>

  • パッケージへの参照

<dependencies>
  <dependency id="jQuery" />
</dependencies>

  • パッケージに含めるファイル

ライブラリとしてプロジェクトの参照に追加するのであれば、

<files>
  <file src="bin\Release\*.*" target="lib\net45" />
</files>

のように指定します。
ファイルとしてプロジェクトに追加するには、lib の代わりに content を指定します。
なお、<files> は <package> の子要素 (<metadata> の兄弟要素) のため注意が必要です。

 

■ NuGet パッケージを作成する

NuGet パッケージ (.nupkg) を作成するには、次のコマンドを実行します。

nuget pack MyLibrary.nuspec

 

■ NuGet パッケージを公開する

NuGet パッケージを公開するには、次の方法があります。

  • コマンドライン

次のコマンドを実行します。

nuget setapikey XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
nuget push MyLibrary.1.0.0.0.nupkg

setapikey を一度実施すれば API キーが保存されるようです。

  • NuGet Package Explorer

NuGet Package Explorer を利用する場合、API キーは毎回指定しなければならないようです。

  • NuGet Gallery

NuGet Gallery でアップロードする場合、API キーを指定する必要はありません。

なお、公開前にローカルの環境でインストールを試すことができます。
そのためには、Visual Studio のオプションでパッケージ ソースにローカル ディレクトリを追加します。

 

■ プロジェクトから NuGet パッケージを作成する方法

一部のメタデータを自動的に補完させる方法もあります。
これは、アセンブリをライブラリとして (target="lib\xxx") パッケージを作成する場合に利用できます。

プロジェクト フォルダー (.csproj などが存在するフォルダー) を作業フォルダーにして

nuget spec

を実行すると、$id$, $version$, $title$, $author$, $description$
というプレースホルダーが含まれた Nuspec ファイルが作成されます。
これらのプレースホルダーには、AssemblyInfo.cs などに記述されたアセンブリ属性の値が利用されます。

あとは、このフォルダー上で

nuget pack

を実行します。
ただし、これだと既定では Debug ビルドされたファイルからパッケージを作成してしまいます。
Release ビルドされたファイルを利用するには、次のコマンドを実行します。

nuget pack -Prop Configuration=Release

 

■ その他のツール

NuGet Packup を使うと、
必要な情報をすべて AssemblyInfo.cs に指定しておくことで NuGet パッケージを作成できます。

NuGet Packup - AssemblyInfo.cs

 

参照
NuGet Gallery
Nuspec Reference
NuGet (CodePlex)
NuGet Package Explorer (CodePlex)

NuGet – NuGet でプロジェクト ライブラリを管理する
NuGet – パッケージを作成して NuGet で公開する
.NET開発の新標準「NuGet」入門(後編)
NuGet Packup (CodePlex)

カテゴリー: ツール. タグ: , . 2 Comments »