2

Daniel Cazzulino の Clarius のブログで、私がやろうとしていることの素晴らしい例を見ました。彼がしたことと同じようなことをしたい。

NuGetを介していくつかの基本的なT4 テンプレートを配信しようとしていますが、それぞれがcsprojファイルにエントリがあり、それらがすべて独立して実行されるため、望ましくありません。値がこのように読み取られた場合、すべて問題ありません。<Generator>TextTemplatingFileGenerator</Generator><Generator></Generator>

上記の例でcsprojを変更したように、 msbuildを使用してこの設定を削除したいと思います。問題のある値を削除するPowerShellスクリプトを作成しましたが、プロジェクトをアンロードする必要があります。msbuildはこのタスクにより適しているようですが、私はそれに慣れていません。いろいろ調べましたが、まだ闇の中にいます。

彼がしたことと私がやりたいことの違いは、彼が何かを追加し、私が何かを編集したいということですが、msbuild xml traversing メソッドを使用して情報を見つける方法がわかりません。

@Keith Hill の助けを借りて作成したPowerShellスクリプトを次に示します。

$ns = @{msb = 'http://schemas.microsoft.com/developer/msbuild/2003'}
$results = 0
$xml = [xml](gc $projName)
$xml | Select-Xml "//msb:Generator" -Namespace $ns | 
       Foreach { 
           $_.Node.set_InnerText('')
           $results = 1
       }
if($results -eq 1){
    $xml.Save($project.FullName)
}

msbuild でこれを行う方法に関する提案はありますか?

Daniel のコードは次のとおりです (NuGet インストール ライフサイクルの一部である Install.ps1 ファイル内に存在します)。

param($installPath, $toolsPath, $package, $project)
    # This is the MSBuild targets file to add
    $targetsFile = [System.IO.Path]::Combine($toolsPath, 'Funq.Build.targets')

    # Need to load MSBuild assembly if it's not loaded yet.
    Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
    # Grab the loaded MSBuild project for the project
    $msbuild = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($project.FullName) | Select-Object -First 1

    # Make the path to the targets file relative.
    $projectUri = new-object Uri('file://' + $project.FullName)
    $targetUri = new-object Uri('file://' + $targetsFile)
    $relativePath = $projectUri.MakeRelativeUri($targetUri).ToString().Replace([System.IO.Path]::AltDirectorySeparatorChar, [System.IO.Path]::DirectorySeparatorChar)

    # Add the import and save the project
    $msbuild.Xml.AddImport($relativePath) | out-null
    $project.Save()
4

1 に答える 1

1

XmlPoke Taskを使用してこれを行うことができます。

<Project DefaultTargets="PokeGenerator">
    <ItemGroup>
        <MyProjectFile Include="$(MSBuildProjectDirectory)\MyProject.csproj" />
    </ItemGroup>

    <Target Name="PokeGenerator">
        <XmlPoke XmlInputPath="%(ProjectConfigFile.FullPath)"
            Query="/x:Project/x:ItemGroup/x:Compile/x:Generator"
            Namespaces="&lt;Namespace Prefix='x' Uri='http://schemas.microsoft.com/developer/msbuild/2003' /&gt;"
            Value="%0a" />
    </Target>
</Project>

XmlInputPath必要に応じておよびQueryパラメータを変更するだけです。

落とし穴は、プロジェクト ファイルが名前空間プレフィックスを使用していない場合でも名前空間プレフィックスを宣言する必要があることと、選択した要素に突き刺すための値を提供する必要があることです。改行は問題ないと考えました。

于 2011-05-23T18:29:14.467 に答える