msbuild SLN仍然可以获得单独的项目输出?

时间:2009-03-10 02:42:34

标签: visual-studio msbuild projects-and-solutions

我有一个普通的SLN文件,我正在使用命令行中的msbuild编译它。我这样做:

C:\ slndir> msbuild / p:OutDir = C:\ slnbin \

它将所有内容转储到C:\ slnbin中,但网站除外,它们部署到C:\ slnbin_PublishedWebsites \。

我想要的是不仅要将所有二进制文件都放在bin目录中,而且每个可执行程序都有自己的“部署”文件夹,类似于每个网站获得的文件夹。

所以,例如,如果我有以下项目:   - 共同   - Lib1   - 服务1   - Lib2   - 服务2

我想得到:

  C:\slnbin\ // Everything
  C:\slbin\Deploy\Service1 // Common, Lib1, Service1
  C:\slbin\Deploy\Service2 // Common, Lib2, Service2

我尝试过像“msbuild / p:OutDir = C:\ slnbin \ $(ProjectName)”这样的东西,但它只是把它视为文字并创建一个实际的“$(ProjectName)”子目录。

首先,我不需要修改每个项目等等。

这可能吗?易?

2 个答案:

答案 0 :(得分:13)

就像John Saunders所说,你需要一个处理这个过程的主MSBuild文件。

以下是使用MSBuild Community Tasks的示例: GetSolutionProjects ,它可以获取给定解决方案的项目

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Package">

  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>

  <!-- Specify here, the solution you want to compile-->
  <ItemGroup>
    <Solution Include="C:\slndir\solution.sln"/>
  </ItemGroup>

  <PropertyGroup>
    <Platform>AnyCPU</Platform>
    <Configuration>Debug</Configuration>

    <!-- Your deployment directory -->
    <DeployDir>C:\slbin\Deploy</DeployDir>
  </PropertyGroup>

  <!-- Gets the projects composing the specified solution -->
  <Target Name="GetProjectsFromSolution">
    <GetSolutionProjects Solution="%(Solution.Fullpath)">
      <Output ItemName="ProjectFiles" TaskParameter="Output"/>
    </GetSolutionProjects>
  </Target>

  <Target Name="CompileProject" DependsOnTargets="GetProjectsFromSolution">
    <!-- 
      Foreach project files
        Call MSBuild Build Target specifying the outputDir with the project filename.
    -->
    <MSBuild Projects="%(ProjectFiles.Fullpath)"
             Properties="Platform=$(Platform);
             Configuration=$(Configuration);
             OutDir=$(DeployDir)\%(ProjectFiles.Filename)\"
             Targets="Build">
    </MSBuild>
  </Target>
</Project>

答案 1 :(得分:1)

你必须“手动”做到这一点。创建一个构建解决方案的主MSBUILD项目文件,然后将所有解决方案输出复制到所需的位置。这(大致)是Visual Studio Team Build如何做到的。