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()