如何解决为nuget创建一个自定义的powershell脚本,该脚本将自定义目标添加到csproj BeforeBuild步骤
| 我想创建一个nuget包,使用我创建的自定义MSBuild任务向我的csproj添加一个BeforeBuild步骤。理想情况下,我想: 将新目标添加到csproj文件(MyCustomBeforeBuildTarget) 如果尚未存在BeforeBuild目标,请添加该目标 编辑BeforeBuild DependsOnTargets属性以包括我的自定义目标 因此,安装后,我的csproj应该包含以下内容:<Target Name=\"MyCustomBeforeBuildTarget\" Condition=\"SomeCondition\">
<MyCustomTask />
</Target>
<Target Name=\"BeforeBuild\" DependsOnTargets=\"MyCustomBeforeBuildTarget\">
</Target>
另外,很高兴当我的软件包被删除时,自定义目标也消失了,
尽管我添加了一个条件,如果自定义任务DLL不存在,则应使其忽略目标。
我可以编写将添加自定义目标的最简单的Powershell nuget安装脚本是什么?我感觉这里的PowerShell脚本可能构成解决方案的一部分,但是我没有足够的PowerShell经验,无法知道如何实际使用它们来编辑csproj。
解决方法
NuGetPowerTools是一个软件包,其中添加了一些PowerShell功能,使添加软件包的项目的项目设置更容易使用。要使用可用的功能,您只需要使软件包依赖NuGetPowerTools,就可以使用软件包nuspec文件中的依赖项标签,如下所示:
<dependencies>
<dependency id=\"NuGetPowerTools\" version=\"0.26\" />
</dependencies>
这样就可以获取对您的项目的构建项目表示形式的引用。
然后,您需要在NuGet软件包的tools
文件夹中放置一个install.ps1
文件,此PowerShell文件将在您安装该软件包时运行,并且在安装后不再运行。
该文件应如下所示:
#First some common params,delivered by the nuget package installer
param($installPath,$toolsPath,$package,$project)
# Grab a reference to the buildproject using a function from NuGetPowerTools
$buildProject = Get-MSBuildProject
# Add a target to your build project
$target = $buildProject.Xml.AddTarget(\"PublishWebsite\")
# Make this target run before build
# You don\'t need to call your target from the beforebuild target,# just state it using the BeforeTargets attribute
$target.BeforeTargets = \"BeforeBuild\"
# Add your task to the newly created target
$target.AddTask(\"MyCustomTask\")
# Save the buildproject
$buildProject.Save()
# Save the project from the params
$project.Save()
就是这样。
问候
杰斯珀·豪格
, 以下代码来自名为CodeAssassin.WixWebProjectReferences的程序包。在安装和卸载后,它将以下导入标记添加到项目文件并将其删除。该软件包不需要任何依赖关系。
<Import Project=\"..\\packages\\CodeAssassin.WixWebProjectReferences.1.0\\tools\\CodeAssassin.WixWebProjectReferences.targets\" />
下载该软件包并使用NuGetPackageExplorer打开它,以了解它的完成方式。
下面是install.ps1和uninstall.ps1的代码(仅当NuGet-package的内容文件夹为非空时才执行它们)。
(我找不到任何powershell高亮显示,因此我改用php,但它并不完美。)
install.ps1
param (
$InstallPath,$ToolsPath,$Package,$Project
)
$TargetsFile = \'CodeAssassin.WixWebProjectReferences.targets\'
$TargetsPath = $ToolsPath | Join-Path -ChildPath $TargetsFile
Add-Type -AssemblyName \'Microsoft.Build,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a\'
$MSBProject = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($Project.FullName) |
Select-Object -First 1
$ProjectUri = New-Object -TypeName Uri -ArgumentList \"file://$($Project.FullName)\"
$TargetUri = New-Object -TypeName Uri -ArgumentList \"file://$TargetsPath\"
$RelativePath = $ProjectUri.MakeRelativeUri($TargetUri) -replace \'/\',\'\\\'
$ExistingImports = $MSBProject.Xml.Imports |
Where-Object { $_.Project -like \"*\\$TargetsFile\" }
if ($ExistingImports) {
$ExistingImports |
ForEach-Object {
$MSBProject.Xml.RemoveChild($_) | Out-Null
}
}
$MSBProject.Xml.AddImport($RelativePath) | Out-Null
$Project.Save()
uninstall.ps1
param (
$InstallPath,$Project
)
$TargetsFile = \'CodeAssassin.WixWebProjectReferences.targets\'
Add-Type -AssemblyName \'Microsoft.Build,PublicKeyToken=b03f5f7f11d50a3a\'
$MSBProject = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($Project.FullName) |
Select-Object -First 1
$ExistingImports = $MSBProject.Xml.Imports |
Where-Object { $_.Project -like \"*\\$TargetsFile\" }
if ($ExistingImports) {
$ExistingImports |
ForEach-Object {
$MSBProject.Xml.RemoveChild($_) | Out-Null
}
$Project.Save()
}
将目标文件复制到输出路径的样本目标文件
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"4.0\">
<ItemGroup>
<Files Include=\"..\\packages\\Insert_Path_To_Your_Package_Folder_Here\\bin\\*\" />
</ItemGroup>
<Target Name=\"Insert_Name_of_Your_Target_Here\" AfterTargets=\"AfterBuild\">
<Copy SourceFiles=\"@(Files)\" DestinationFolder=\"$(TargetDir)\\bin\\\" SkipUnchangedFiles=\"true\" />
</Target>
</Project>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。