我正在使用Jenkins和MSBuild构建我们的解决方案,并希望使用与我们的一个Visual Studio插件捆绑在一起的命令行工具为我们生成CSS和JavaScript。由于我希望显而易见的原因,我想使用MSBuild和Visual Studio项目文件来执行此操作,而不是必须维护单独的批处理文件。
我已经创建了一个单独的.targets
文件并且已经运行了,但是当我自己抓取文件时,我正在努力。我可以使用通配符从文件系统中获取文件,但我真正想做的是从项目文件本身获取文件列表。
以下是我们项目文件的简要版本 - 我删除了很多“默认”内容:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- I'll omit all the standard project bits and bobs for brevity -->
<ItemGroup>
<Content Include="css\scss\styles.scss">
<Compile>True</Compile>
<Minify>False</Compile>
<CompileStyle>Nested</CompileStyle>
<DebugInfo>False</DebugInfo>
</Content>
<Content Include="css\scss\_imported-1.scss">
<Compile>False</Compile>
<Minify>False</Compile>
<CompileStyle>Nested</CompileStyle>
<DebugInfo>False</DebugInfo>
</Content>
<Content Include="css\scss\_imported-2.scss">
<Compile>False</Compile>
<Minify>False</Compile>
<CompileStyle>Nested</CompileStyle>
<DebugInfo>False</DebugInfo>
</Content>
</ItemGroup>
<Import Project="$(SolutionDir)\.webcompile\WebCompile.targets" />
</Project>
WebCompile.targets看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<BuildDependsOn>
$(BuildDependsOn);
WebCompile
</BuildDependsOn>
</PropertyGroup>
<ItemGroup>
<SassFiles Include="**/*.scss" />
</ItemGroup>
<Target Name="WebCompile">
<Message Text="SassFiles: @(SassFiles)" />
</Target>
</Project>
这将返回Solution目录中的所有匹配的*.scss
文件,但我真的很有兴趣只返回已在项目文件中列出的<Compile>
子节点设置为True
。
这可能吗?
答案 0 :(得分:1)
这将返回解决方案中所有匹配的* .scss文件 目录,但我真的很有兴趣只返回文件 已经在具有子节点的项目文件中列出 设为True。
您可以向SassFiles项目组添加过滤器,其中只显示具有相应条件的成员。
<ItemGroup>
<SassFiles Include= "@(Content)" Condition = "'%(Extension)' == '.scss' AND '%(Compile)' == 'true'"/>
</ItemGroup>
@Abit,这是我的MsBuild脚本(保存为“abit.msbuild”):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="WebCompile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- I'll omit all the standard project bits and bobs for brevity -->
<ItemGroup>
<Content Include="css\scss\styles.scss">
<Compile>True</Compile>
<Minify>False</Minify>
<CompileStyle>Nested</CompileStyle>
<DebugInfo>False</DebugInfo>
</Content>
<Content Include="css\scss\_imported-1.scss">
<Compile>False</Compile>
<Minify>False</Minify>
<CompileStyle>Nested</CompileStyle>
<DebugInfo>False</DebugInfo>
</Content>
<Content Include="css\scss\_imported-2.scss">
<Compile>False</Compile>
<Minify>False</Minify>
<CompileStyle>Nested</CompileStyle>
<DebugInfo>False</DebugInfo>
</Content>
</ItemGroup>
<Target Name="WebCompile">
<ItemGroup>
<SassFiles Include="@(Content)" Condition="'%(Extension)' == '.scss' AND '%(Compile)' == 'true'" />
</ItemGroup>
<Message Text="SassFiles: @(SassFiles)" />
</Target>
</Project>
这是我正在运行的命令:
%WinDir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe abit.msbuild
这是输出:
Project "d:\msbuild\abit.msbuild" on node 1 (default targets).
WebCompile:
SassFiles: css\scss\styles.scss
Done Building Project "d:\msbuild\abit.msbuild" (default targets).
由于@(SassFiles)ItemGroup上的条件,我没有看到任何错误,我相信我看到了正确的输出。