3

私は MSBuild.Community.Tasks を使用して、バージョンの調整とファイルの圧縮という 2 つのことを支援しています。私はこれと結婚していないので、探しているものが生成されるのであれば、別のアプローチを歓迎します。目標は、ビルドの前にビルド番号をインクリメントし、ビルド後に新しい DLL (いくつかの他のファイルを含む) を ZIP することです。ZIP ファイルは、ビルドに従って名前を付ける必要があります。

私はほとんどそこにいますが、DLL のバージョン番号は常に version.txt ファイルの 1 ステップ遅れています (バージョン タスクから自動生成されます)。BeforeBuildターゲットにあるものは次のとおりです。

  <Target Name="BeforeBuild" BeforeTargets="PrepareForBuild">
    <Message Text=" --=== Before Build ===--"></Message>
    <ItemGroup>
      <PreviousFiles Include="$(MSBuildProjectDirectory)\BuildPackage\$(AssemblyName).*.zip">
        <InProject>false</InProject>
      </PreviousFiles>
    </ItemGroup>
    <Delete Files="@(PreviousFiles)"></Delete>
    <Delete Files="$(MSBuildProjectDirectory)\BuildPackage\$(AssemblyName).dll"></Delete>
    <Version VersionFile="version.txt" RevisionType="Increment">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
  </Target>

これにより、以前のビルドからすべてのファイルが削除され、version.txt ファイルが正しくインクリメントされます。

次に、私のAfterBuildターゲットでこれをまとめました:

  <Target Name="AfterBuild" AfterTargets="Build">
    <Message Text=" --=== After Build ==--"></Message>
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyVersion.cs" AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
    <ItemGroup>
      <ProjectOutputFiles Include="bin\$(AssemblyName).dll">
        <InProject>false</InProject>
      </ProjectOutputFiles>
      <ZipFiles Include="$(MSBuildProjectDirectory)\BuildPackage\*.*" Exclude="$(MSBuildProjectDirectory)\BuildPackage\*.zip">
        <InProject>false</InProject>
      </ZipFiles>
    </ItemGroup>
    <Copy SourceFiles="@(ProjectOutputFiles)" DestinationFolder="$(MSBuildProjectDirectory)\StorePackage" />
    <Zip Files="@(ZipFiles)" WorkingDirectory="$(MSBuildProjectDirectory)\BuildPackage" ZipFileName="$(MSBuildProjectDirectory)\BuildPackage\$(AssemblyName).$(Major)-$(Minor)-$(Build)-$(Revision).zip" ZipLevel="9" />
  </Target>

AssemblyInfo.cs基本的に、いくつかのファイル グループを更新して指定しています。次に、プロジェクトの出力をコピーし、最後に必要なファイルを ZIP に圧縮します。

DLL のバージョンが実際のリビジョン番号よりも常に 1 リビジョン番号遅れていることを除いて、これはすべてうまく機能します。

ここで明らかな何かが欠けていますか?ビルドプロセスが開始される前にバージョンがキャプチャされるようなものです。

前もって感謝します。

4

1 に答える 1

2

GOSH、はい、明らかな何かが欠けています。投稿する直前に質問を読み直すとすぐに、私が間違ったことをしたことが明らかになりました. 私もそれを綴りました。

修正は、AssemblyInfoタスクを BeforeBuild ターゲットに移動することでした。これは、正しいバージョン管理情報を DLL に挿入するために必要な属性を含む .cs ファイルを出力するタスクです。ビルドが完了するまでこのファイルの更新を放置すると、私の DLL は永続的に競争に負けることになります。

他の誰かが同様のことに遭遇した場合に備えて、とにかくこれを投稿します。

乾杯。


編集 価値があるのは、これらのターゲットの最終バージョンでは、解決できなかった競合状態のため、ZIP操作を別のターゲットに移動する必要がありました(私はそれをZipProjectOutputと呼びました):DLLはZIPファイルに表示されませんでした、そしてOSがファイルのロックを解除したタイミングか何かが原因だったのではないかと思います。

を使用AfterTargets="AfterBuild"して、他のターゲットが完了したときに ZipProjectOutput ターゲットを実行しました。問題を解決するのではなく、ここでレースに「勝つ」だけだと確信していないため、これについて完全に満足しているわけではありませんが、これは今ではかなりうまく機能しています. #WFM

于 2013-02-13T04:04:51.183 に答える