使用MSBuild生成多个解决方案,并将应用程序复制到单独的文件夹中

使用MSBuild生成多个解决方案,并将应用程序复制到单独的文件夹中,msbuild,visual-studio-2017,console-application,Msbuild,Visual Studio 2017,Console Application,我有大约80个控制台应用程序,我想构建并输出到一个保留目录下的单独目标目录 c:\builds /App1 /App2 /app3 这个脚本进行大规模构建,但我似乎无法让它将完成的输出从发布目录复制到目标目录,也无法将输出直接发送到目标目录 <Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

我有大约80个控制台应用程序,我想构建并输出到一个保留目录下的单独目标目录

c:\builds
  /App1
  /App2
  /app3
这个脚本进行大规模构建,但我似乎无法让它将完成的输出从发布目录复制到目标目录,也无法将输出直接发送到目标目录

<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
    <Solution Include="./**/*.sln"> 
            <Properties>Configuration=Release;Platform=Any CPU</Properties>
    </Solution>
    <MyReleaseFiles Include=".\bin\release\*.*" Exclude=".\bin\release\*vshost.exe" />
    </ItemGroup>

    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <MyReleaseOutput>.\release</MyReleaseOutput>
        <OutputPath>c:\builds\$(AssemblyName)\</OutputPath>
        <OutDir>$(OutputPath)</OutDir>
    </PropertyGroup>

    <Target Name="Build">
        <MSBuild Projects="@(Solution)" BuildInParallel="true" Targets="Build" />
        <MakeDir Directories="$(OutputPath)" />
        <Copy SourceFiles="@(MyReleaseFiles)" DestinationFolder="$(OutputPath)" />
    </Target>

 </Project>

配置=释放;平台=任何CPU
释放
任意CPU
释放
c:\builds\$(AssemblyName)\
$(输出路径)
使用MSBuild生成多个解决方案,并将应用程序复制到单独的文件夹中


正如stijn所说,“OutputPath必须在生成的项目中设置,只有在那里它才能在项目上下文中计算$(AssemblyName)”,因此我们不能直接在项目文件外使用它

<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
    <Solution Include="./**/*.sln"> 
            <Properties>Configuration=Release;Platform=Any CPU</Properties>
    </Solution>
    <MyReleaseFiles Include=".\bin\release\*.*" Exclude=".\bin\release\*vshost.exe" />
    </ItemGroup>

    <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
        <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
        <MyReleaseOutput>.\release</MyReleaseOutput>
        <OutputPath>c:\builds\$(AssemblyName)\</OutputPath>
        <OutDir>$(OutputPath)</OutDir>
    </PropertyGroup>

    <Target Name="Build">
        <MSBuild Projects="@(Solution)" BuildInParallel="true" Targets="Build" />
        <MakeDir Directories="$(OutputPath)" />
        <Copy SourceFiles="@(MyReleaseFiles)" DestinationFolder="$(OutputPath)" />
    </Target>

 </Project>
作为一种解决方法,您可以将
ItemGroup
子文件夹一起用于每个项目:

  <ItemGroup>
    <Projects Include="project1.csproj" />
      <Subfolder>project1</Subfolder>
    <Projects Include="project2.csproj" />
      <Subfolder>project2</Subfolder>
    <Projects Include="project3.csproj" >
      <Subfolder>project3</Subfolder>
    </Projects>
  </ItemGroup>
认证:


希望这有帮助。

必须在生成的项目中设置OutputPath,只有在那里它才能在项目上下文中计算$(AssemblyName)。也有人问过类似的问题,例如:谢谢你,利奥。很明显,我的想法有点歪。给定一个包含n个子文件夹的应用程序文件夹,每个子文件夹包含一个解决方案,我将构建所有解决方案,并将它们的输出复制到我目前指定的暂存文件夹中。听起来我必须在编写脚本时知道这n个子文件夹是什么。实际上,我所针对的集合或子集合可能会有所不同。瞧,我不能做我想做的事。