我有一个普通的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)”子目录。
首先,我不需要修改每个项目等等。
这可能吗?易?
答案 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如何做到的。