Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find MSBuildProjectDirectory Parent Directory

Tags:

msbuild

MSBuild 3.5

I have the following project structure:

trunk/MainSolution.sln
trunk/Build/MyBuild.Proj
trunk/Library/...
trunk/etc...

So far, I've been using the following property to find out the project root folder:

<RootFolder>$(MSBuildProjectDirectory)\..\</RootFolder>

Everything was working great, until I tried using a copy task that relied on this path. It is not resolving correctly. I basically end up getting something like this which is not valid:

C:\Projects\MyProject\Trunk\Build\..\CodeAnalysis\myfile.xml

So basically, I need to get the full path for (MSBuildProjectDirectory)'s Parent.

like image 224
B Z Avatar asked Feb 05 '09 02:02

B Z


People also ask

Where is MSBuildProjectDirectory defined?

MSBuild has reserved property called MSBuildProjectDirectory , which is to the absolute path of the directory where you project or script file is located, C:\Dev in your case. Therefore "$(MSBuildProjectDirectory)\temp" is exactly what you're looking for.

What is the symbol for parent directory?

.. (double-dot) is the parent of your current directory. ~ (tilde) is your home directory. / (slash) if it present at first character, it usually is called root directory.


2 Answers

Nowadays with MSBuild 4.0 and above you don't want to use CreateItem or CreateProperty tasks anymore. What you are asking for can be solved easily with msbuild property functions:

<!-- Prints the parent directory's full path. -->
$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..'))

If you just want to read the parent directory's folder name you can combine the above statement with the GetFileName property function:

$([System.IO.Path]::GetFileName('$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)\..'))'))

A bit verbose but much better than the other answer as this works outside of targets and can be assigned to a property.

like image 114
Viktor Hofer Avatar answered Oct 04 '22 07:10

Viktor Hofer


Item metadata is your friend!

<Target Name="GetMSBuildProjectParentDirectory">
  <!-- First you create the MSBuildProject Parent directory Item -->
  <CreateItem Include="$(MSBuildProjectDirectory)\..\">
    <Output ItemName="MSBuildProjectParentDirectory" TaskParameter="Include"/>
  </CreateItem>

  <!-- You can now retrieve its fullpath using Fullpath metadata -->
  <Message Text="%(MSBuildProjectParentDirectory.Fullpath)"/>

  <!-- Create a property based on parent fullpath-->
  <CreateProperty Value="%(MSBuildProjectParentDirectory.Fullpath)">
    <Output PropertyName="CodeFolder" TaskParameter="Value"/>
  </CreateProperty>
</Target>
like image 31
Julien Hoarau Avatar answered Oct 04 '22 06:10

Julien Hoarau