2012-02-10 73 views
1

我建设有MSBuild的Visual Studio解决方案结构解决方案outputpath通过项目

msbuild.exe my.sln 

这样,它输出的一切在每个项目(默认BIN \)指定的输出路径,但在这种情况下,我需要将所有输出的文物放在不同的文件夹中,用于包装。如果我运行

msbuild.exe my.sln /p:OutputhPath=<someFolder> 

然后所有的工件将在指定的文件夹中结束,但结构将是平坦的。我想什么它是,就是:

\package 
    \project1 
    \project2 
    ... 

但我想不出一个好办法做到这一点,而不需要修改个别项目文件(这几乎是毫无疑问的)。有任何想法吗? (MSBuild的4.0,VS2010 - 如果改变任何东西)

+0

感谢downvote,不管是谁。解决方法可能是运行powershell脚本来修改项目文件,然后构建它们,然后撤消修改 - 似乎只有MSBuild才能做到这一点 – Hassan 2012-02-14 15:36:37

+0

有些人只是奇怪不是他们。我认为这是一个很好的问题。 – 2013-04-16 11:20:32

回答

2

有可能是一个更好的办法,但有一两件事你可以做的是msbuild.exe my.sln建设到位,然后将输出复制到\package目录,所以你保持层次。这应该很简单。您可以使用此作为起点:

<Target Name="Package"> 
    <PropertyGroup> 
     <SourceFolder>$(MSBuildProjectDirectory)\src</SourceFolder> 
     <TargetFolder>$(MSBuildProjectDirectory)\package</TargetFolder> 
    </PropertyGroup> 

    <ItemGroup> 
     <FilesToCopy Include="$(SourceFolder)\**\bin\Debug\**\*.*" /> 
    </ItemGroup> 

    <!-- Recursive copy w/o flattening folder structure: --> 
    <Copy 
     SourceFiles="@(FilesToCopy)" 
     DestinationFiles="@(FilesToCopy->'$(TargetFolder)\%(RecursiveDir)%(Filename)%(Extension)')" 
     /> 
    </Target> 

您还可以定义一个属性来跟踪你的构建配置,并与bin\$(BuildConfig)更换硬编码bin\Debug

+0

一个好主意,但%(RecursiveDir)会给我完整的路径,不仅是项目名称 - 在我的情况下,这可能是一个很长的路径。 – Hassan 2012-02-10 17:32:39

+0

%(RecursiveDir)应该只给出与通配符(**)相匹配的部分,因此如果您的项目都直接位于src \文件夹下,则只需获取项目名称即可。如果您有不同的文件夹结构,也许可以使用字符串函数来修改元属性。请参阅此处以获取更多信息:http://msdn.microsoft.com/en-us/library/ms164313.aspx – 2012-02-10 17:46:25

+0

为您完成此项工作?如果是,你能接受答案吗? – 2012-02-12 17:11:26