我有一个C#库项目,其中一些依赖项是在使用PowerShell的“BeforeBuild”中创建的。
似乎每次都会执行目标“BeforeBuild”,即使库项目本身不需要构建。
我想配置构建过程,仅在需要(重新)构建库时才运行PowerShell脚本。
有办法实现吗?
我尝试使用目标“BeforeBuild”和“BeforeCompile”。但似乎每次都会执行。
我有一个C#库项目,其中一些依赖项是在使用PowerShell的“BeforeBuild”中创建的。
似乎每次都会执行目标“BeforeBuild”,即使库项目本身不需要构建。
我想配置构建过程,仅在需要(重新)构建库时才运行PowerShell脚本。
有办法实现吗?
我尝试使用目标“BeforeBuild”和“BeforeCompile”。但似乎每次都会执行。
codeanalysis.lastsucceeded
),并使用该文件进行比较。增量构建将仅查看所有输入的最后更改日期,并将其与所有输出进行比较。因此,您需要将运行或不运行的需求表达为该数据的操作。<target name="RunMyPowerShell"
beforetargets="Compile" Inputs="@(Content)"
Outputs"@(Content->'%(Filename).translated.content')">
...
<exec Command="powershell .\mypsfile.ps1" />
...
</targets>
BeforeTargets="Build"
的替代方案,您可以覆盖 BuildDependsOn
属性:<PropertyGroup>
<CompileDependsOn>
RunMyPowerShell;
$(CompileDependsOn)
</CompileDependsOn>
</PropertyGroup>
另一种方法是在目标上添加一个基于某些表达式的条件,但是由于建立文件被解析、计算和执行的方式,这样做可能会很难弄明白如何正确执行。
如果你能做到这些,可能会有巨大的性能提升。
另请参见:
RunPS
的属性,并以以下方式向您使用的BeforeTarget添加条件: <PropertyGroup>
<RunPS>false</RunPS>
</PropertyGroup>
<Target Name="BeforeBuild" Condition="$(RunPS)=='true'">
<!--Run the ps script here-->
</Target>
然后,您可以通过设置RunPS
的值来控制是否使用默认的BeforeTarget或自定义BeforeTarget。
msbuild xx.csproj /p:RunPS=true
在构建过程中运行ps脚本,msbuild xx.csproj
运行原始的BeforeTarget
如果您在VS IDE中构建项目,则可以创建从Debug或Release复制的新配置(CustomDebug),并将Condition="$(Configuration)=='CustomDebug'"
设置为目标。
更新:
适用于VS和命令行的解决方法:
请参见this document,在VS中,我们可以通过从Debug和Release Configurations复制设置轻松创建新配置。
1.我认为,对于您的库项目,您有普通的Debug和Release Configurations,您可以按照文档中的提示创建相应的自定义配置。从Debug中复制设置并创建一个名为PSDebug的新配置,从Release中复制设置并创建一个名为PSRelease的新配置。
2.然后编辑xx.csproj,在此格式中添加条件:
<Target Name="BeforeBuild" Condition="'$(Configuration)'=='PSDebug' OR '$(Configuration)'=='PSRelease'">
<!--Run the ps script here-->
<Message Text="showsth" Importance="high" />
</Target>
然后在VS IDE中,如果您使用普通配置Debug或Release
进行构建,则会使用默认的BeforeBuild
目标。只有当您使用自定义PSDebug或PSRelease
进行构建时,它才会调用您的自定义BeforeBuild
目标。在VS中,您可以通过此框轻松切换这些配置:
对于命令行,它同样适用。如果您使用像 msbuild xx.csproj /p:Configuration=Debug
这样的命令,它将使用预定义的 BeforeBuild 目标来执行此操作,如果您使用像 msbuild xx.csproj /p:Configuration=PSDebug
这样的命令,则会调用您的自定义目标并运行 PS 脚本。