21

msbuild を呼び出す Visual Studio 2008 でビルド前のタスクを使用しています。

C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe $(MSBuildProjectDirectory)\version.targets /p:Configuration=$(ConfigurationName)

version.targets 内で、AssemblyInfo.cs ファイルを更新してバージョン情報を置き換えています。

   <FileUpdate
        Encoding="ASCII"
        Files="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs"
        Regex="AssemblyInformationalVersion\(&quot;.*&quot;\)\]" 
        ReplacementText="AssemblyInformationalVersion(&quot;Product $(ConfigurationString) ($(buildDate))&quot;)]"
    />

Visual Studio 2008 でプロジェクトをビルドすると、問題なくビルドされます。

しかし、結果のexeのバージョン情報を見ると、AssemblyInfo.csが「正しい」ものに変更されていても、以前のタイムスタンプが含まれています。

ビルド前の変更はメインのコンパイル タスクでは認識されず、常に 1 つ遅れているようです。

私が間違っていることのアイデアはありますか?

4

4 に答える 4

25

私はあなたが何か悪いことをしているとは思わない-それはバグだ。

私はここでそれを報告しました-あなたがそれを再現して検証を追加できるかどうかを確認してください、多分私たちはそれをMSによって修正することができます。

編集:「BeforeBuild」イベントでファイルを更新するために「Si」による提案を試しましたが、Visual Studio 2008/SP1でも同じ間違った結果が得られます。

更新/回避策:MSはバグレポートに応答しました。回避策として、追加できます

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>

csprojファイルに。

于 2009-03-14T16:11:01.597 に答える
14

<UseHostCompilerIfAvailable>FALSE</UseHostCompilerIfAvailable>受け入れられた解決策もリンクされた記事も、ファイルの最初の要素に行を追加する必要があること <PropertyGroup>.csprojを指定していませんが、トリックの+1 。

同じファイルでコマンドラインからmsbuild.csprojを呼び出すと(トリックなしで)、生成されたコードファイルがすぐにコンパイルされます(以前のバージョンではない)ため、これはVisualStudioのみの問題でもあります。

また、このトピックを見つけるために多くのことを掘り下げなければならなかったので、このトピックに次のタグを付けることをお勧めします。

  1. VisualStudio
  2. コンパイラ
  3. BeforeBuild
  4. 生成された
  5. 。ネット
  6. c#
于 2009-09-28T01:47:11.950 に答える
3

興味深いことに、BeforeBuildに接続された独自のカスタムタスクを作成しましたが、これは正常に機能しています。コマンドラインを介してVSまたはMSBuildから問題が発生したことはありません。だから私はBeforeBuildをもう少し探索すると言うでしょう...

ビルドサーバー(CruiseControl.NET)のビルド番号をバージョンの「ビルド」部分として使用しているため、すべてのアセンブリに組み込まれています(ソリューション内のアセンブリ間でAssemblyVersionとAssemblyFileVersionの同じAssemblyInfo.csを共有しています)。次に、これは(FileUpdateタスクを介して)WiXプロジェクトの変数にプッシュされ、MSIファイル名のラベル付けにも使用されます。

<Target Name="BeforeBuild">
  <CallTarget Targets="UpdateAssemblyInfo" />
</Target>

<Target Name="UpdateAssemblyInfo" Condition="'$(CIBuildNumber)' != ''">
  <UpdateVersion Attribute="AssemblyFileVersion"
    AssemblyInfo=".\Properties\AssemblyInfo.cs" 
    BuildNumber="$(CIBuildNumber)" />
</Target>

グーグルを行う場合は、他の例を見つける必要があります...申し訳ありませんが、UpdateVersionコードを提供できません。私の仕事の許可が必要ですが、ネット上で適切なものが見つからない場合は、カスタムタスクは簡単です。書くと上記が役立つはずです。

于 2009-03-14T16:41:01.867 に答える
0

以下のようなものを使用して、任意のファイルのコンテンツを変更します。ここでは、ビルドを作成するたびに、hallo.aspx のビルド日付の値を変更しています。


例: Hallo.aspx コンテンツ

<ビルド日> 12-23.2011 </ビルド日>


<!-- regular expression to get value between html node: "[^<>]+(?=[<])" --> 
  <FileUpdate Files="$(AboutDir)Hallo.aspx" 
    Regex="Builddate[^&lt;&gt;]+(?=[&lt;])" ignoreCase="true" 
    ReplacementText="BuildDate: $(Day)-$(Month)-$(Year)" /> 

于 2011-09-06T08:47:47.733 に答える