質問

T4ファイルを使用して、アセンブリバージョンを管理しています。基本的に私たちはフォローしています これらの手順 各ビルドでアセンブリバージョンを再生します。これは、.csprojの使用に行われます 2013年と2013年のSDKのモデリング そうするには MSBuildでT4再生構成をカスタマイズします.

これはうまく機能します!残念ながら、Team Foundation Serviceのチームビルドは、ビルドサーバー上のVS 12のインスタンスには、デフォルトのインストール場所にtextTemplating.targetsがないため、ビルド時にT4コード生成をサポートしていないようです。仮定して、モデリング/VS SDKはビルドサーバーに(TFService Build障害ログから)インストールされていません。

インポートされたプロジェクト「C:プログラムファイル(x86) msbuild 12.0 microsoft visualstudio v12.0 texttemplating microsoft.texttemplating.targets」は見つかりませんでした。宣言のパスが正しいこと、およびファイルがディスクに存在することを確認してください。

Microsoft-Released VS 2013アドオン(VS SDK、SDKのモデリングなど)をビルドサーバーイメージにインストールする計画はありますか?

GITを介してTeam Foundationサービスにコードをコミットしたとき、ビルドが壊れないように、実装できる作業はありますか?

TFServiceのホストビルドコントローラーを構成して、ビルド中にT4ファイルを変換するにはどうすればよいですか?

役に立ちましたか?

解決

最終的に、ビルドサーバーをアートバージョンするタスクに対する別のソリューションを作成することになりました。 T4を使用してAssemblyInfo.csファイルを動的に作成する代わりに、ソリューション内の他のプロジェクトへのアイテムリンクを介して共有する代わりに(したがって、この目的のためにファイルの再生を維持する方法を把握する迷惑に対処する必要があります)。 T4を完全に回避しました。サードパーティのリモートビルドマシンと統合された作業が多すぎて、T4操作などを可能にするアドオンとSDKを管理していました。 MSBUILDコミュニティタスク 私が見つけたこと これはとても質問です. 。ソリューションは、T4に比べてエレガントにシンプルです!これが揺れ動く方法です:

このプロジェクト、application.versioning.csprojが構築されるたびに、第3パーティで定義されたmsbuildタスク、nugetインストールされた 'msbuildcommunityタスクのライブラリは動的に生成されます AssemblyFileversion, AssemblyInformationalVersion, AssemblyVersion 現在のUTC日付時間に基づいて、このプロジェクトの「プロパティ」ディレクトリにある新しいファイルであるAutoVersion.CSに入力します(AssemblyInfo.csファイルと並んで)。 AssemblyInfo.csには、これらのアセンブリ属性があり、複数の定義されたアセンブリ属性のビルドエラーを回避するために永久にculされます)。 Autoversion.CSの世代(ビルドの直前に発生)の後、コンパイラは前述のアセンブリバージョン属性を構築されたアセンブリに統合します。このバージョン化は、それらが構築されたUTC時間を反映しています(以下を参照)。

.slnの他のすべての.csprojは、生成されたautoversion.csファイルへのファイルリンクを作成するこの動的、ビルドタイムアセンブリバージョンにサブスクライブします。これらのアセンブリには、AssemblyInfo.cs 'Prunedも必要です。 .slnのすべての購読.csprojsのアセンブリバージョンは、myApplication.version.csprojが構築される(または再構築)するたびに行われます。バージョンプロジェクトの.csprojは次のとおりです。

  <!-- START DYNAMIC ASSEMBLY VERSIONING WORK-->
  <!--MSBuild Community Tasks path as installed via the nuget package 'Install-Package MSBuildTasks'-->

 <PropertyGroup>
    <MSBuildCommunityTasksPath>$(MSBuildThisFileDirectory)..\.build</MSBuildCommunityTasksPath>
    <My-PropertiesDir>Properties</My-PropertiesDir>
  </PropertyGroup>
  <PropertyGroup>

   <!--this should only be incremented (starting at zero) for MAJOR application releases this should never be reset only incremented!--> 
    <ManualMajorVersion>0</ManualMajorVersion>

   <!--3 digits maximum should only be manually incremented (starting at zero) for feature releases-->
   <!--!this should be reset to '0' at the start of each caldenar Year-->  
    <ManualMinorVersion>0</ManualMinorVersion>
  </PropertyGroup>

   <!--Import MSBuild Community Tasks library installed from Nuget -->
   <!--This library contains defined MSBUILD tasks useful for dynamically generating Assembly information via MSBUILD https://github.com/loresoft/msbuildtasks--> 
  <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />
  <Target Name="BeforeBuild">
    <Time Format="yy.MM.dd.HHmm" Kind="Utc">
      <Output TaskParameter="FormattedTime" PropertyName="My-VersionNumber" />
    </Time>
    <Message Text="Auto versioning from UTC time: $(My-VersionNumber) ...">
    </Message>
    <Time Format="yy" Kind="Utc">
      <Output TaskParameter="FormattedTime" PropertyName="Year" />
    </Time>
    <Time Format="MM" Kind="Utc">
      <Output TaskParameter="FormattedTime" PropertyName="Month" />
    </Time>
    <Time Format="dd" Kind="Utc">
      <Output TaskParameter="FormattedTime" PropertyName="Day" />
    </Time>
    <Time Format="HH" Kind="Utc">
      <Output TaskParameter="FormattedTime" PropertyName="Hour" />
    </Time>
    <Time Format="mm" Kind="Utc">
      <Output TaskParameter="FormattedTime" PropertyName="Minute" />
    </Time>
    <ItemGroup>
      <My-AssemblyInfo Include="$(My-PropertiesDir)\AutoVersion.cs" />
      <Compile Include="@(My-AssemblyInfo)" />
    </ItemGroup>
    <MakeDir Directories="$(My-PropertiesDir)" />
    <PropertyGroup>
      <GeneratedAssemblyVersion>$(ManualMajorVersion).$(Year)$(ManualMinorVersion).$(Month)$(Day).$(Hour)$(Minute)</GeneratedAssemblyVersion>
    </PropertyGroup>
    <AssemblyInfo OutputFile="@(My-AssemblyInfo)" CodeLanguage="CS" AssemblyFileVersion="$(GeneratedAssemblyVersion)" AssemblyInformationalVersion="$(GeneratedAssemblyVersion)" AssemblyVersion="$(GeneratedAssemblyVersion)" Condition="$(GeneratedAssemblyVersion) != '' " />
  </Target>
  <!-- END DYNAMIC ASSEMBLY VERSIONING WORK-->

自分自身を検証するためのユニットテストと同様に:

/// <summary> A test to validate the configured, auto-generated assembly versioning is working as expected </summary>
[Test]
public void AssemblyVersioningTest()
{
    DirectoryInfo currentDirectory = new DirectoryInfo(Directory.GetCurrentDirectory());
    DirectoryInfo versioningDir = new DirectoryInfo(currentDirectory.FullName + "\\" + VERSIONING_DYNAMIC_FILE_DIRECTORY);

    // verify versioning directory located/loaded/exists
    Assert.IsTrue(versioningDir.Exists);

    // locate the VERSIONING_DYNAMIC_FILE file within the VERSIONING_DYNAMIC_FILE_DIRECTORY directory
    string dynamicFilePath = versioningDir.FullName + "\\" + VERSIONING_DYNAMIC_FILE;

    // get the FileInfo for the file that is used to dynamically generate assembly versioning
    FileInfo dynamicVersioningFileInfo = new FileInfo(dynamicFilePath);
    Assert.IsTrue(dynamicVersioningFileInfo.Exists);

    // get the two digit creation Dates/Times for the assembly's file as strings
    // since that's what the versioning reflects
    DateTime dynamicVersioningFileLastWriteTime = dynamicVersioningFileInfo.LastWriteTime;

    #region    Created VERSIONING_DYNAMIC_FILE
    string dynamicVersioningFileLastWriteTimeYear = dynamicVersioningFileLastWriteTime.ToUniversalTime().ToString("yy");

    string dynamicVersioningFileLastWriteTimeMonth = dynamicVersioningFileLastWriteTime.ToUniversalTime().ToString("MM");
    string dynamicVersioningFileLastWriteTimeDay = dynamicVersioningFileLastWriteTime.ToUniversalTime().ToString("dd");

    string dynamicVersioningFileLastWriteTimeHour = dynamicVersioningFileLastWriteTime.ToUniversalTime().ToString("HH");
    string dynamicVersioningFileLastWriteTimeMinute = dynamicVersioningFileLastWriteTime.ToUniversalTime().ToString("mm");
    #endregion Created VERSIONING_DYNAMIC_FILE

    // get *this* assembly from the .sln using reflection since this assembly consumes/is dependent upon the versioning functionality we
    // are testing
    Assembly theAssemblyExecutingThisTest = Assembly.GetExecutingAssembly();

    // get this assembly's version
    // we will investigate this to compare it to a reverse-engineering of what we would
    // expect it to be based 
    AssemblyName testingAssemblyName = theAssemblyExecutingThisTest.GetName();
    Version testingAssemblyVersion = testingAssemblyName.Version;

    #region    Generated Assembly Versioning
    // get the first two digits of the assemblyVersion.MinorVersion - these represent the year
    string testingAssemblyVersionMinorYear = testingAssemblyVersion.Minor.ToString().Substring(0, 2);
    // the rest of the digits represent the manually-configured version and can be 1-3 chars long
    string testingAssemblyVersionMinorManual = GetMinorManualFromVersionString(testingAssemblyVersion.Minor.ToString());

    string testingAssemblyVersionBuildMonth = testingAssemblyVersion.Build.ToString("D4").Substring(0, 2);
    string testingAssemblyVersionBuildDay = testingAssemblyVersion.Build.ToString("D4").Substring(2, 2);

    string testingAssemblyVersionRevisionHour = testingAssemblyVersion.Revision.ToString("D4").Substring(0, 2);
    string testingAssemblyVersionRevisionMinute = testingAssemblyVersion.Revision.ToString("D4").Substring(2, 2);
    #endregion Generated Assembly Versioning

    // verify the assembly's minor version: last two digits match of assembly file creation year
    // (pad minorversion 4 spaces in case released minor version is empty)
    Assert.AreEqual(dynamicVersioningFileLastWriteTimeYear,
        testingAssemblyVersionMinorYear,
        "Assembly's minor version: last two digits do not match assembly file last write time year");

    // verify the assembly's minor version is comprised of two digit 'released minor version' + two digit year of assembly file creation date
    Assert.AreEqual(dynamicVersioningFileLastWriteTimeYear + testingAssemblyVersionMinorManual,
        testingAssemblyVersionMinorYear + testingAssemblyVersionMinorManual,
        "Assembly's minor version: not comprised of two digit year of assembly file last write time date + dynamically-sized 'minor manual version' + ");

    // verify the Assembly's build version is comprised of two digit month + two digit day of assembly file creation date
    Assert.AreEqual(dynamicVersioningFileLastWriteTimeMonth + dynamicVersioningFileLastWriteTimeDay,
        testingAssemblyVersionBuildMonth + testingAssemblyVersionBuildDay,
        "Assembly's build version: not comprised of two digit month + two digit day of assembly file last write time date");

    // verify the Assembly's revision version is comprised two digit hour + two digit minute of assembly file creation date
    Assert.AreEqual(dynamicVersioningFileLastWriteTimeHour + dynamicVersioningFileLastWriteTimeMinute,
        testingAssemblyVersionRevisionHour + testingAssemblyVersionRevisionMinute,
        "Assembly's revision version: comprised two digit hour + two digit minute of assembly file last write time date");
}

他のヒント

V&M SDKファイル(Microsoft.textTemplating.build.tasks.dll、microsoft.texttemplating.targets、microsoft.visualstudio.textttemplating.sdk.host.1x.0.0.dll)を含むことにより、同様の問題を解決しました。コントロール。

IMOこれは、大規模なプロジェクトでサードパーティのSDKを管理する1つの真の方法です。すべての個々の開発マシンにインストールし、サーバーをビルドすることは脆すぎて実用的ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top