代码之家  ›  专栏  ›  技术社区  ›  Boarder2

使用MSBuild生成输出内容而不使用VS项目

  •  0
  • Boarder2  · 技术社区  · 16 年前

    最终目标是运行一个可执行文件来输出一个文件,我们希望构建的输出就是这个文件。在这个版本中,没有任何VS项目。

    生成正在由TFS生成服务运行。

    这是我的.proj文件的内容

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
     <Target Name="Build">
      <Message Text="Output Dir: $(OutDir)" />
      <MakeDir Directories="$(OutDir)" />
      <Exec Command='dir /s > \\ANetworkPath\dir.txt
        dir /s > $(OutDir)Dir2.txt'/>
     </Target>
    </Project>
    

    将dir写入网络路径的第一个命令成功,但是它没有显示$(OutDir)的存在。所以我想我会尝试用MakeDir创建它。当第二个dir命令执行时,它会出错,因为路径不存在。

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe /nologo /noconsolelogger "C:\Builds\1\Scratch\Test Build\Sources\user\Test\Build.proj" /m:1 /fl /p:SkipInvalidConfigurations=true  /p:OutDir="C:\Builds\1\Scratch\Test Build\Binaries\\" /p:VCBuildOverride="C:\Builds\1\Scratch\Test Build\Sources\user\Test\Build.proj.vsprops"  /dl:WorkflowCentralLogger,"C:\Program Files\Microsoft Team Foundation Server 2010\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";"Verbosity=Normal;BuildUri=vstfs:///Build/Build/111;InformationNodeId=6570;TargetsNotLogged=GetNativeManifest,GetCopyToOutputDirectoryItems,GetTargetPath;TFSUrl=http://tfshost:8080/tfs/Test%20Collection;"*WorkflowForwardingLogger,"C:\Program Files\Microsoft Team Foundation Server 2010\Tools\Microsoft.TeamFoundation.Build.Server.Logger.dll";"Verbosity=Normal;"
    

    唯一的输出是在网络上写入的文件中:

    Directory of C:\Builds\1\Scratch\Test Build\Sources\user\Test
    
    09/17/2010  10:53 AM    <DIR>          .
    09/17/2010  10:53 AM    <DIR>          ..
    09/17/2010  10:53 AM    <DIR>          A Directory
    09/17/2010  10:53 AM                 0 Test.log
    09/17/2010  10:53 AM               453 Test.proj
    09/17/2010  10:53 AM               201 Test.proj.vsprops
                   3 File(s)            654 bytes
    
     Directory of C:\Builds\1\Scratch\Test Build\Sources\user\Test\A Directory
    
    09/17/2010  10:53 AM    <DIR>          .
    09/17/2010  10:53 AM    <DIR>          ..
    09/17/2010  10:53 AM                 9 A File.txt
    09/17/2010  10:53 AM                15 Another File.txt
                   2 File(s)             24 bytes
    
         Total Files Listed:
                   5 File(s)            678 bytes
                   5 Dir(s)  40,243,372,032 bytes free
    

    以下是生成日志:

    Build started 9/17/2010 12:05:29 PM.
    Project "C:\Builds\1\Scratch\Test Build\Sources\user\Test\Test.proj" on node 1 (default targets).
    Build:
      Output Dir: C:\Builds\1\Scratch\Test Build\Binaries\
      dir /s > C:\Builds\1\Scratch\Test Build\Binaries\Dir2.txt
      The system cannot find the path specified.
    C:\Builds\1\Scratch\Test Build\Sources\user\Test\Test.proj(24,3): error MSB3073: The command "dir /s > C:\Builds\1\Scratch\Test Build\Binaries\Dir2.txt" exited with code 1.
    Done Building Project "C:\Builds\1\Scratch\Test Build\Sources\user\Test\Test.proj" (default targets) -- FAILED.
    
    Build FAILED.
    
    "C:\Builds\1\Scratch\Test Build\Sources\user\Test\Test.proj" (default target) (1) ->
    (Build target) -> 
      C:\Builds\1\Scratch\Test Build\Sources\user\Test\Test.proj(24,3): error MSB3073: The command "dir /s > C:\Builds\1\Scratch\Test Build\Binaries\Dir2.txt" exited with code 1.
    
        0 Warning(s)
        1 Error(s)
    
    Time Elapsed 00:00:01.14
    

    我是不是完全错了?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Benjamin Baumann    16 年前

    你的代码在我的电脑里运行得很好。 但是:您应该通过在命令行调用中传递OutDir属性来实例化它:

    c:\WINDOWS\Microsoft.NET\Framework\v4.0\MSBuild.exe test.proj /p:OutDir=MyNewDir
    

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <PropertyGroup>
        <OutDir>MyNewDir</OutDir>
      </PropertyGroup>
    
     <Target Name="Build">
      <Message Text="Output Dir: $(OutDir)" />
      <MakeDir Directories="$(OutDir)" />
      <Exec Command='dir /s > \\ANetworkPath\dir.txt
        dir /s > "$(OutDir)\Dir2.txt"'/>
     </Target>
    </Project>
    

    请注意在dir命令中添加的\。

    :我明白了:输出路径中有一个空格。除非用引号封装路径,否则dir/s>my path\Dir2.txt命令将不起作用。在dos shell中尝试以下命令:

    mkdir C:\Builds\1\Scratch\Test Build\Binaries\
    mkdir "C:\Builds\1\Scratch\Test Build\Binaries\"
    

    您会注意到区别(第一行创建了两个目录,一个是C:\Builds\1\Scratch\Test,另一个是.\Build\Binaries)。我编辑了上面的代码以添加引号。

        2
  •  0
  •   Boarder2    16 年前

    这也会起作用。

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <Target Name="Build">
            <Exec Command='dir /s > Dir2.txt'/>
            <Copy SourceFiles='Dir2.txt' DestinationFolder='$(OutDir)' />
        </Target>
    </Project>