7

次のようなSilverlight3プロジェクトがあります。

<ItemGroup>
  <Content Include="Content\image1.png">
  </Content>
</ItemGroup>

基本的に、プロジェクトにPNGファイルを追加し、そのビルドアクションを「コンテンツ」に設定しました。これはうまく機能します。

今、私がやりたいのは、プロジェクトに別の形式の画像を追加し、ビルド時にそれらをPNGに変換できるようにすることです。これにより、プロジェクトにPNG画像を追加したかのようになります(コンテンツとして)そもそも。

言い換えれば、XAPパッケージに画像をPNG形式で表示したいのです。

理想的には、Visual Web Developer 2008 Expressで動作するように(IDEにドラッグしてビルドアクションを変更することでプロジェクトに画像ファイルを追加できるように)、システムを作成せずにこれを実行したいと思います。 -全体的な変更。

私が変換したい特定のフォーマットはXCFです-私はすでにPNGへの変換を行うための.NETコードを持っています。MSBuildタスクを作成する必要があると想定しています。

私はMSBuildの経験があまりないので、そのようなものを組み合わせる方法を知りたいです。


MSBuildがどのように機能するかについての私の大まかな理解に基づいて、私は知る必要があると思います。

  • @(Content)ファイル拡張子に基づいて 、(または他の)コレクションからアイテムを(再)移動してアイテムのコレクションを作成するにはどうすればよいですか?
    • または:Visual Web Developer2008Expressで使用できるカスタムビルドアクションを作成します
  • 入力項目のパスを受け取る方法はTask
  • 場所(.NETまたはMSBuild?)および?によって生成された出力ファイルの場所を指定するTask方法
  • 入力ファイルが変更された場合にファイルが確実に再構築されるようにするにはどうすればよいですか?
  • どこに(おそらくBeforeBuild?)そしてどのように変換されたアイテムを再注入するの@(Content)ですか?(または、他のコレクションを使用する必要がありますか?)
    • または:それらをXAPに取り込む他の方法はありますか?

そして、これが物事を行うための合理的な方法のように思われる場合、または私が何かを逃した場合はどうなりますか?

4

3 に答える 3

13

全体的な目標を達成するために特定のサブ質問をしましたが、全体的なタスクに対する暗記的な答えを得るのではなく、MSBuildについて学びたいと思います(これは、他の多くの人々から得られるものです。バウンティ)なので、私はあなたの個々の質問に答えてから、それらすべてを解決策にまとめようとします。

したがって、すべての.jpgファイルを.pngに変換するとします。

拡張機能に基づいて、コンテンツアイテムリストからサブリストを作成します。

<ItemGroup>
    <Sublist Include="@(Content)" Condition=" '%(Extension)' == '.jpg' " />
</ItemGroup>

タスク内のアイテムのパスを受け取ります。

2つの方法-タスクが受け入れることができる入力によって異なります。この方法は、サブリストの各アイテムに対する「foreach」のようなものであり、Execタスクで使用する傾向があります。

<Exec Command="convert.exe /Input:%(Sublist.FullPath)" />

出力パスの指定は、.exeまたは現在のタスク、および特定のタスクに対する出力パスの意味によっても異なります。

それはディレクトリなのか、それとも拡張子が異なる単なるファイル名なのか。ただし、同じ名前で拡張子が異なるファイルを出力することを想定しています。

<Exec Command="convert.exe &quot;%(Sublist.FullPath)&quot;  &quot;%(Sublist.RootDir)%(Sublist.Directory)%(Sublist.Filename).png&quot;" />    

jpgが変更された(またはクリーンアップされた)場合にpngを再構築する方法。

これは、convertコマンドが実行される包含ターゲット要素のInputsandOutputs属性を使用しています。入力はソースファイルが何であるかを指定し、出力はターゲットが生成するものを指定します。次に、MSBuildは入力の日時と出力の日時を比較し、それらが古くなっている場合は、出力が再構築されます

<Target Name="ConvertJpg"  
        Inputs="@(Content)"
        Outputs="@(Content -> '%(RootDir)%(Directory)%(Filename).png' )"
        Condition=" '%(Extension)' == '.jpg' "
  • 入力は、「コンテンツ」アイテムグループを使用したいことを示しています
  • Condition属性により、拡張子が.jpgで終わるコンテンツアイテムのみを操作できるようになります。
  • Outputs属性は、使用している入力のうち、パスとファイル名が類似しているが、拡張子が.pngのファイルを生成することを示しています。

最後に、生成された.pngファイルを@Contentアイテムグループに再挿入する必要があることを正しく認識しました。これは簡単です。コンテンツアイテムに含めるだけです。サブリストには.jpgファイルが含まれていることを思い出してください。これらのファイルが必要ですが、末尾に.pngが付いています。また、pngが生成された後は、コンテンツアイテムグループに.jpgファイルを含めたくありません。

<Content Remove="@(Sublist)" />
<Content Include="@(Sublist -> '%(RootDir)%(Directory)%(Filename).png' )" />

要約すると、あなたのターゲットは次のようになります。

<Target Name="ConvertJpg"  
        Inputs="@(Content)"
        Outputs="@(Content -> '%(RootDir)%(Directory)%(Filename).png' )"
        Condition=" '%(Extension)' == '.jpg' "
    <ItemGroup>
        <Sublist Include="@(Content)" Condition=" '%(Extension)' == '.jpg' " />
    </ItemGroup>

    <Exec Command="convert.exe /Input:%(Sublist.FullPath) Output=%(Sublist.RootDir)%(Sublist.Directory)%(Sublist.Filename).png" />

    <Content Remove="@(Sublist)" />
    <Content Include="@(Sublist -> '%(RootDir)%(Directory)%(Filename).png' )" />
</Target>

ちなみに、ImageMagikにはjpgをpngに変換するコマンドラインツールがあります...

于 2010-08-10T09:29:05.870 に答える
2

私はあなたがこのようなものが欲しいと信じています:

<ItemGroup>
  <JPGContent Include="foo.jpg" />
</ItemGroup>
<Target Name="BeforeBuild" 
        Inputs="@(JPGContent)" Outputs="%(JPGContent.Filename).png">
  <!-- replace this with call to jpg->png converter -->
  <Exec Command="copy %22%(JPGContent.FullPath)%22 %(JPGContent.Filename).png" />
  <ItemGroup>
    <Content Include="%(JPGContent.Filename).png" />
  </ItemGroup>
</Target>
<Target Name="AfterBuild">
  <!-- just demoing that 'Content' now has right value -->
  <Warning Text ="Content=@(Content)" />
</Target>

ここで、変換する新しいJPGContentBuildActionを指定します。

(おそらくhttp://msdn.microsoft.com/en-us/library/ms164313.aspx%22も参照してください。これは、属性に引用符を埋め込むための単なる方法であることに注意してください。)

于 2010-08-10T08:11:10.213 に答える
0

MSBuildタスクを作成する代わりに、カスタムツールを作成し、イメージファイルのプロパティのカスタムツールでこれを指定することもできます。

「カスタムツールは設計時にファイルを変換し、変換の出力を別のファイルに配置します」

例:DataSet。アプリケーションで使用するクラスを取得するための独自の変換ツールがあります。

このアプローチの利点は、設計時に生成されたファイルを使用できることです。

サンプルの実装は http://www.drewnoakes.com/snippets/WritingACustomCodeGeneratorToolForVisualStudio/にあります。

于 2010-08-10T08:09:08.487 に答える