MSBuild,过滤.cs文件的整个解决方案的示例

时间:2008-10-21 13:06:22

标签: msbuild

我想学习MSBuild,想知道是否有人可以让我开始使用简单的构建脚本来过滤掉所有带.cs扩展名的文件的vs.net 2008项目。

  1. 如何运行构建?
  2. 你通常在哪里存储构建?

2 个答案:

答案 0 :(得分:1)

您通常使用以下语法从命令行运行MSBuild脚本:

MSBuild <scriptfilename> /t:targetname

您可以在此处获取更多信息:http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx

您要通过解析项目文件中的所有.cs文件来完成什么?请记住,使用VS2005及更高版本,项目文件本身就是 MSBuild脚本,因此您只需在命令行上调用MSBuild并将其命名为项目文件的名称即可。适当的目标。

话虽这么说,如果你创建一个单独的脚本文件,我通常会将它们存储在根项目文件夹中。

如果您希望将文件列表作为以分号分隔的单个字符串属性:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <Import Project="Project.csproj" Condition="Exists(Project.csproj')"/>

  <Target Name="Test">
     <Message Text="@(Compile)"/>
  </Target>
</Project>

如果您希望能够单独显示每个文件:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <Import Project="Project.csproj" Condition="Exists(Project.csproj')"/>

  <Target Name="Test">
     <Message Text="%(Compile.FullPath)"/>
  </Target>
</Project>

遍历每个样本,第一行(<Project ...>)确定这是一个MSBuild项目文件的事实,定义DefaultTargets(如果没有目标(/ t:targetname),将运行的那些目标)在命令行上给出)用于验证文件的XML模式(xmlns)和要使用的MSBuild版本(ToolsVersion)。

第二行(<Import ...>)告诉MSBuild包含名为“Project.csproj”的MSBuild脚本的内容(如果存在)。

最后,我们定义一个名为“Test”的目标,其中包含一个任务。该任务是“消息”任务,它在屏幕上打印一条消息(“文本”中包含的内容)。

在第一个示例<Message Text="@(Compile)"/>中,我们将名为“Compile”的ItemGroup引用为分号分隔列表。在第二个示例中,我们引用相同的ItemGroup,但循环遍历该ItemGroup中的每个项目并打印“FullPath”元数据内容。 (Compile ItemGroup在我们在第2行导入的.csproj中定义。)

答案 1 :(得分:0)

C:\projects\_Play\SimpleIpService>type \\sysrdswbld1\public\bin\mrb-vs2008.cmd
@echo off

call "c:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"

echo %0 %*
echo %0 %* >> %MrB-LOG%
cd
if not ""=="%~dp1" pushd %~dp1
cd
if exist %~nx1 (
        echo VS2008 build of '%~nx1'.
        echo VS2008 build of '%~nx1'. >> %MrB-LOG%
        set MrB-BUILDLOG=%MrB-BASE%\%MrB-WORK%.%MrB-NICEDATE%.%MrB-NICETIME%.build-errors.log
        msbuild.exe %~nx1 /t:Rebuild /p:Configuration=Release > %MrB-BUILDLOG%
        findstr /r /c:"[1-9][0-9]* Error(s)" %MrB-BUILDLOG%
        if not errorlevel 1 (
                echo ERROR: sending notification email for build errors in '%~nx1'.
                echo ERROR: sending notification email for build errors in '%~nx1'. >> %MrB-LOG%
                call mrb-email "Mr Build isn't happy about build errors in '%~nx1'" %MrB-BUILDLOG%
        ) else (
                findstr /r /c:"[1-9][0-9]* Warning(s)" %MrB-BUILDLOG%
                if not errorlevel 1 (
                        echo ERROR: sending notification email for build warnings in '%~nx1'.
                        echo ERROR: sending notification email for build warnings in '%~nx1'. >> %MrB-LOG%
                        call mrb-email "Mr Build isn't happy about build warnings in '%~nx1'" %MrB-BUILDLOG%
                ) else (
                        echo Successful build of '%~nx1'.
                        echo Successful build of '%~nx1'. >> %MrB-LOG%
                )
        )
) else (
        echo ERROR '%1' doesn't exist.
        echo ERROR '%1' doesn't exist. >> %MrB-LOG%
)
popd