Visual Studio Team ServicesでGitHub Flow

Visual Studio Advent Calendar 2016 - Qiitaの 13日目のエントリです。 (飛び入り参加で失礼します。)

個人のプロジェクト管理にVisual Studio Team Services(VSTS、かつてのVisual Studio Online)を利用しています。

今回はVSTSGitHub Flow開発する方法を紹介したいと思います。 (プロジェクトの始め方は前回の記事を参考にしてみてください。)

f:id:ohke:20161127144307j:plain

バックログの作成

最初にバックログを作成します。

f:id:ohke:20161127150527j:plain

ちなみにこのバックログは、プルリクストのマージと同期していないので、New、Approve、Committed、Doneなどの状態管理は手動で行う必要があります。 (ブラウザからだけではなく、Visual Studioからもできます。)

f:id:ohke:20161127160520j:plain

ブランチの作成

登録したバックログの一つを選んでmasterからブランチを切ります。

バックログの詳細画面を開き、「Create New Branch」を選択します。

f:id:ohke:20161127151734j:plain

バックログ番号(ここでは#34)を入力し、「Create branch」でブランチを作成します。

f:id:ohke:20161127151147j:plain

そうすると、「#34」というブランチが作成されます。

f:id:ohke:20161127151158j:plain

チェックアウト

作成したブランチを、次にVisual Studioでチェックアウトします。

まず、チームエクスプローラから同期を行います。

f:id:ohke:20161127152138j:plain:w300

すると、先ほど作成したリモートブランチ(#34)が現れますので、チェックアウトします。

f:id:ohke:20161127152331j:plain:w300

チェックアウトが完了すると、ローカルブランチも「#34」へ切り替わっていることが確認できます。

f:id:ohke:20161127152529j:plain:w300

プルリクエスト

チェックアウトしたブランチに対してコミットとプッシュを行い、プルリクエストします。

まずはプッシュして、リモートブランチ(#34)へ変更を反映します。 コミットコメントにバックログ番号を先頭に付加しています。

f:id:ohke:20161127154922j:plain:w300

チームエクスプローラから新しいプル要求を行います。

f:id:ohke:20161127153328j:plain:w300

ブラウザでVSTSが立ち上がりますので、プッシュしたコミットが含まれていることを確認し、Reviewerを指定して(ここでは自分自身にします)、「New pull request」でプルリクエストを行います。 ちなみに、コミットコメントのバックログ番号がバックログへのリンクとなっています。

f:id:ohke:20161127153816j:plain

レビュー

レビューアはプルリクエストを確認します。もちろんレビューアもレビューイも自分です。

試しに、ソースコードに対してコメントし、Rejectすることで修正を促します。

f:id:ohke:20161127154616j:plain

f:id:ohke:20161127154743j:plain

f:id:ohke:20161127154731j:plain

修正版をチェックインして再レビューを行い、OKであればApproveとします。

f:id:ohke:20161127155304j:plain

マージ

最後にmasterへマージします。

プルリクエスト画面の「Complete」を押下し、コメント等を確認し、「Complete merge」でマージされます。 デフォルトではマージ後にブランチは削除されます。

f:id:ohke:20161127155452j:plain

これで完了です。 ローカルのmasterブランチのチェックアウトと#34ブランチの削除もしておきましょう。

f:id:ohke:20161127155706j:plain

まとめ

現在のところ、一人での開発でしか使っていませんが、バックログやタスクのアサインもできますので、チーム開発でも十分利用できるかと思います。

DataSetの使い方を学ぶ

最近、少し前に開発されたASP.NET Web Formsのアプリケーションを仕事でメンテナンスしてます。

そこでDataSet(System.Data.DataSet)を初めて扱ったのですが、わからないことが多くて時間を費やしてしまったので、少し勉強することにしました。

DataSet=メモリ上にデータベースを構成するクラス

MSDN.aspx)ではデータのメモリ内のキャッシュと説明されていますが、これではちょっとイメージしづらいです。

元々はデータベースから取得したデータ(テーブルやレコードなど)をメモリ上でも扱えるようにするデータ構造なので、「メモリにデータベースを構成するクラス(群)」と言ったほうが捉えやすくなるかと思います。

DBなので複数のテーブルを持ち、1つのテーブルは複数のカラムと行からなる包含関係を持ちます。

  • System.Data.DataSetクラス(=DB)
    • System.Data.DataTableクラス(=テーブル)
      • System.DataColumnクラス(=列・カラム)
      • System.DataRowクラス(=行・レコード)

基本的なデータの作成と参照

上の通り包含関係となっているので、まずはDataSetを作成する必要があります。

// DataSetの作成
var company = new DataSet();

次にDataTableとDataColumn定義してDataSetへ追加します。 ここまでがDDLに相当します。

// DataTableの作成
var employees = new DataTable("Employees");

// DataColumnをカラム名と型を指定して定義
// (ここではstring型のId、Name、UInt型のAgeの3つ)
var id = new DataColumn("Id", typeof(string));
employees.Columns.Add(id);
var name = new DataColumn("Name", typeof(string));
employees.Columns.Add(name);
var age = new DataColumn("Age", typeof(uint));
employees.Columns.Add(age);

// DataTableをDataSetに追加
company.Tables.Add(employees);

最後にレコードをDataTableのRowsプロパティへ挿入します。

  1. DataRowのインスタンスはDataTableのNewRowメソッドで取得
  2. 取得したDataRowインスタンスのインデクサ([])でカラムを指定して値を設定
// DataRowの定義
// DataRowのインスタンスはDataTable#NewRowを使用する。
var employee1 = employees.NewRow();
employee1["Id"] = "000001";
employee1["Name"] = "荒岩 一味";
employee1["Age"] = 40;

// インデックスでも指定可能(Addした順番で、開始は0)
var employee2 = employees.NewRow();
employee2[0] = "000002";
employee2[1] = "田中 一郎";
employee2[2] = 29;

// DataTableへの挿入
employees.Rows.Add(employee1);
employees.Rows.Add(employee2);

挿入したレコードの値を参照するためには、3段階でアクセスします。

  1. DataSetのTablesプロパティからDataTableのインスタンスを取得
  2. DataTableのRowsプロパティからDataRowのインスタンスを取得
  3. DataRowのインデクサでカラムを指定して値を取得
// カラム名の取得
var idColumnName = company.Tables[0].Columns[0].ColumnName;
var nameColumnName = company.Tables[0].Columns[1].ColumnName;
var ageColumnName = company.Tables[0].Columns[2].ColumnName;

// レコードの値をインデックスで取得
var r = company.Tables[0].Rows[0];
Console.WriteLine($"{idColumnName}:{r[0]} " +
                  $"{nameColumnName}:{r[1]} " +
                  $"{ageColumnName}:{r[2]}");
// Id: 000001 Name: 荒岩 一味 Age: 40

// レコードの値をカラム名で取得
r = company.Tables["Employees"].Rows[1];
Console.WriteLine($"{idColumnName}:{r[idColumnName]} " +
                  $"{nameColumnName}:{r[nameColumnName]} " +
                  $"{ageColumnName}:{r[ageColumnName]}");
// Id: 000002 Name: 田中 一郎 Age: 29

VIsual StudioでDataSetクラスを定義

DataSetですが継承クラスとして定義する方法がVisual Studioで提供されています。

まずはソースコードファイルを追加するようにソリューションエクスプローラーを右クリックして追加を選び、「Visual C# アイテム」を選択し、「DataSet」アイテムを追加します。

f:id:ohke:20161203230919p:plain

追加すると、4つのファイルが生成されます。 重要な点として、.Designer.csファイルにはSystem.Data.DataSetを継承したCompanyDataSetクラスが新たに定義されています。

f:id:ohke:20161203231121p:plain:w300

この中で、xsdファイルを選択するとデザイナが開きますので、DataTableを追加します。

f:id:ohke:20161203231136p:plain

DataTableにカラムを追加したり、プロパティで型やその他の制約を設定したりできます。

f:id:ohke:20161203231154p:plain

CompanyDataSetのメンバーを確認すると、DataSetのTablesプロパティに加えてEmployeesプロパティが追加されています。 さらにEmployeesDataTableクラスとEmployeeRowクラスがインナークラスとして定義されてます。

f:id:ohke:20161203231221p:plain:w300

EmployeesDataTable(System.Data.TypedTableBaseを継承)ではDataColumnが、EmployeeRow(System.Data.DataRowを継承)ではカラムの値がそれぞれプロパティとなっており、プロパティを介してアクセスできるようになっています。

f:id:ohke:20161203231322p:plain:w300 f:id:ohke:20161203231326p:plain:w300

CompanyDataSetでデータを作成・参照するコードを示します。 DataSetデザイナを使わない先程の方法と比較して、異なる点が2点あります。

  • DataSet、DataTable、DataColumn、DataRowを継承したクラスを使う
  • プロパティを介してDataTable、DataColumn、DataRowの値へアクセスできる
    • インデクサを使ったアクセスでは実行時にしかエラーとならないので、プロパティが使えることは利点
// CompanyDataSetクラスを使う
var companyDataSet = new CompanyDataSet();

// CompanyDataSetのコンストラクタ内でEmployeesDataTableは生成されるので、
// 以下のように生成・追加する必要はない(追加すると同名のテーブルが2つ作られてしまう)
// companyDataSet.Tables.Add(new CompanyDataSet.EmployeesDataTable());

// companyDataSet.EmployeesからCompanyDataSet.EmployeesRowのインスタンスを取得
var employee3 = companyDataSet.Employees.NewEmployeesRow();

// プロパティでアクセスできる
employee3.Id = "000003";
employee3.Name = "広田 けいこ";
employee3.Age = 32;

// companyDataSet.Employeesプロパティへを追加
companyDataSet.Employees.AddEmployeesRow(employee3);

var idColumnName = companyDataSet.Employees.IdColumn.ColumnName;
var nameColumnName = companyDataSet.Employees.NameColumn.ColumnName;
var ageColumnName = companyDataSet.Employees.AgeColumn.ColumnName;

var r = companyDataSet.Employees.Rows[0];
// プロパティではなくテーブル名でもアクセスできる
// var r = companyDataSet.Tables[companyDataSet.Employees.TableName].Rows[0];

Console.WriteLine($"{idColumnName}:{r[idColumnName]} " +
                  $"{nameColumnName}:{r[nameColumnName]} " +
                  $"{ageColumnName}:{r[ageColumnName]}");
// Id:000003 Name:広田 けいこ Age:32

DataSetでLINQを使う

DataTableはコレクション構造の一種なので、LINQが使えそうな気がしてきます。

ですが、Rowsプロパティ(System.Data.DataRowCollectionクラス)はIEnumerableを実装していないので、そのままではLINQは使えません。

// WhereやSelectなどの拡張メソッドが無いためコンパイルエラーとなる
companyDataSet.Employees.Rows.Where(e => e.Age >= 30).Select(e => e.Name);

その代わり、DataTableクラスのAsEnumerableメソッドを使えば、IEnumerableを実装するEnumerableRowCollectionクラスが返されるので、LINQを使えるようになります。

// AsEnumerableメソッドからIEnumerableを実装するEnumerableRowCollectionが返される
var names =
    companyDataSet.Employees.AsEnumerable()
    .Where(e => e.Age >= 30).Select(e => e.Name);
foreach (var name in names)
{
    Console.WriteLine(name);
}

まとめ

DataSetを使ったデータの定義や参照・更新について触れました。

データベースやASP.NET Web Formsとの連携などは、また別の機会に取り組みたいと思います。

Visual Studio Team Servicesでチームプロジェクトをスタートする

Visual Studio Advent Calendar 2016 - Qiitaの2日目のエントリです。

個人のプロジェクト管理にVisual Studio Team Services(VSTS、かつてのVisual Studio Online)を利用しています。 これから何回かに分けて、VSTSの使い方を紹介していきたいと思います。

f:id:ohke:20161201220033p:plain

Visual Studio Team Servicesとは

オールインワンのプロジェクト管理ツールで、かつてVisual Studio Onlineと呼ばれていたものです。 Gitが使える、バックログなども同梱、そして5人まで無料といった嬉しい特徴を持っています。

azure.microsoft.com

今回はチームプロジェクトの立ち上げについて紹介します。

チームプロジェクトを作る

まずはMicrosoftアカウントを作成し、VSTSにログインします。

Visual Studio Team Services - クラウド開発ツール | Microsoft Azure

そして、Homeからプロジェクトを新規作成します。

f:id:ohke:20161130224351p:plain:w400

次にプロジェクト名などを入力し(ここではソースコードレポジトリとしてGitを選択しています)て進め、

f:id:ohke:20161130224920p:plain:w300

f:id:ohke:20161130224943p:plain:w300

これで終わりです。超簡単ですね。

画面左上に設定したプロジェクト名のルームが作成されていることがわかります。

f:id:ohke:20161130225049p:plain

ソースコードをホストさせる

試しにCodeのページを開いてみますが当然空なので、今度はソースコードをホストさせてみます。

f:id:ohke:20161130225439p:plain

Homeに戻って「Open in Visual Studio」をクリックし、Visual Studioを開きます。

f:id:ohke:20161130230132p:plain

すると、既にチームプロジェクトへの接続もされていますので、このまま複製(git clone)します。

f:id:ohke:20161130230811p:plain:w300

f:id:ohke:20161130231316p:plain:w300

複製が終わると、ローカルレポジトリ「Sample Application」が作成され、カレントブランチも「master」に切り替わります。

f:id:ohke:20161130231409p:plain:w300

最初のコミット&プッシュ

最後にテンプレートプロジェクト(ASP.NET MVC)をコミット&プッシュしてみます。

新規プロジェクトを作成して、

f:id:ohke:20161130232041p:plain

チームエクスプローラの変更タブからコミットし、

f:id:ohke:20161130232114p:plain:w300

f:id:ohke:20161130232138p:plain:w300

同期タブからプッシュさせて完了です。

f:id:ohke:20161130232202p:plain:w300

f:id:ohke:20161130232259p:plain:w300

最後にCodeページを見てみると、SampleApplicationプロジェクトのソースコードがホストされていることがわかります。

f:id:ohke:20161130232446p:plain

まとめ

GitHubやBitBucketなどのホスティングサービスと比較しても遜色無く、VSTSでもスピーディにチームプロジェクトを立ち上げられることがおわかりいただけたかと思います。

次はVSTSGitHubっぽく使う方法を紹介したいと思います。