【问题标题】:How do you recursively call tasks in MSBuild?如何递归调用 MSBuild 中的任务?
【发布时间】:2009-02-17 11:48:56
【问题描述】:
例如我想每次都调用这些脚本传递差异参数:
<ItemGroup>
<SqlFiles Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\Tables\*.sql" />
<SqlFiles Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\Functions\*.sql" />
<SqlFiles Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\Views\*.sql" />
<SqlFiles Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\ForeignKeys\*.sql" />
<SqlFiles Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\StoredProcedures\*.sql" />
<SqlFiles Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\Data\*.sql" />
</ItemGroup>
【问题讨论】:
标签:
.net
msbuild
build-process
msbuild-task
【解决方案1】:
您可以通过使用带有 Properties 的 MSBuild Task。
<!-- Dont itemize sql files now, if you want to differenciate the task operations -->
<ItemGroup>
<SqlDirs Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\Tables" />
<SqlDirs Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\Functions" />
<SqlDirs Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\Views" />
<SqlDirs Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\ForeignKeys" />
<SqlDirs Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\StoredProcedures" />
<SqlDirs Include="$(SourceServicesDbSqlRootDir)CreateScripts\$(SourceServiceName)\Data" />
</ItemGroup>
<Target Name="MainTask">
<MSBuild Projects="$(MSBuildProjectFile)"
Properties="SqlDir=%(SqlDirs.Fullpath)"
Targets="RecursivelyCalledTask">
<Output ItemName="ProjSources" TaskParameter="TargetOutputs"/>
</MSBuild>
</Target>
<Target Name="RecursivelyCalledTask">
<!-- We create here the SqlFiles items based on SqlDir-->
<CreateItem Include="$(SqlDir)\*.sql">
<Output ItemName="SqlFiles" TaskParameter="Include"/>
</CreateItem>
<Message Text="SqlFiles -> @(SqlFiles)"/>
</Target>