gpt4 book ai didi

xml - 在PowerShell中使用msbuild在NuGet中的安装事件上编辑csproj

转载 作者:行者123 更新时间:2023-12-03 00:04:52 24 4
gpt4 key购买 nike

我在Clarius的Daniel Cazzulino's Blog上看到了一个很好的例子。我想做些和他一样的事。

我正在尝试通过提供一些基本的 T4模板,但遇到了一个问题,因为它们每个在 csproj 文件中都有一个条目,上面写着<Generator>TextTemplatingFileGenerator</Generator>,这使它们全部独立运行,这是不希望的。如果该值读取为<Generator></Generator>,则一切正常。

我想使用 msbuild 删除此设置,就像您在上面的示例中修改了 csproj 一样。
我已经编写了 PowerShell 脚本来删除有问题的值,但是它需要卸载项目。 Msbuild 似乎更适合此任务,但我不熟悉它。我已经做了一些搜索,但仍然处于黑暗中。

他所做的事情和我想做的事情之间的区别是,他添加了一些内容,我想编辑一些内容,但是我不知道如何使用 msbuild xml遍历方法来查找信息。

这是我在@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()

最佳答案

您可以使用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>

您只需要修改 XmlInputPathQuery参数即可满足您的需求。

需要注意的是,即使项目文件不使用任何 namespace 前缀,您也必须声明一个 namespace 前缀,并且您需要提供一个值以戳入选定的元素-我认为换行符不会受到影响。

关于xml - 在PowerShell中使用msbuild在NuGet中的安装事件上编辑csproj,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6075234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com