Hassan
Hassan

Reputation: 2633

structure solution outputpath by project

I'm building a visual studio solution with msbuild

msbuild.exe my.sln

This way it outputs everything to the output paths specified in each project (bin\ by default), but in this case I need all the output artefacts to be in different folder, used for packaging. If I run

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

Then all the artifacts will end up in the specified folder, but the structure will be flat. What I would like it to be, is:

\package
    \project1
    \project2
    ...

But I can't think of a good way to do this, without modifying individual project files (which is almost out of question). Any ideas? (msbuild 4.0, VS2010 - if that changes anything)

Upvotes: 2

Views: 824

Answers (1)

Giscard Biamby
Giscard Biamby

Reputation: 4609

There is probably a better way, but one thing you could do is build in place with msbuild.exe my.sln, and then copy the outputs to your \package dir so you keep the hierarchy. It should be pretty simple to do. You can use this as a starting point:

<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>

You can also define a property to keep track of your build configuration, and replace the hardcoded bin\Debug with bin\$(BuildConfig).

Upvotes: 2

Related Questions