Как я могу получить текущий каталог в скрипте msbuild? - PullRequest
64 голосов
/ 21 января 2010

В моем скрипте msbuild мне нужно передать полный каталог в качестве параметра. Как можно получить это?

Пример: я запускаю скрипт из C: \ dev, мне нужен относительный путь temp, поэтому я после C: \ dev \ temp

Примечание: я не знаю, из какой папки будет запускаться скрипт.

Ответы [ 3 ]

92 голосов
/ 21 января 2010

Игорь довольно близко. MSBuildProjectDirectory - это свойство, которое даст вам полный путь к файлу проекта, который был вызван в командной строке. Так что если у вас есть следующие скрипты:

  • C: \ Temp \ MyProj.proj
  • C: \ Shared \ shared.targets

И MyProj.proj импортирует shared.targets, и этот файл передается в msbuild.exe, тогда значение для MSBuildProjectDirectory всегда будет C: \ temp , даже если вы ссылаетесь на это внутри разделяемого .targets. Если ваши shared.targets требуют знания пути, они должны быть объявлены в известных свойствах. Например, файлы проекта C # определяют значение для OutputPath, а общий файл Microsoft.Common.targets использует это свойство.

Редактировать: MSBuild 4

Если вы используете MSBuild 4, теперь вы можете использовать свойства для этого типа значения.

  • MSBuildThisFile
  • MSBuildThisFileDirectory
  • MSBuildThisFileDirectoryNoRoot
  • MSBuildThisFileExtension
  • MSBuildThisFileFullPath
  • MSBuildThisFileName

См. http://sedodream.com/2010/03/11/MSBuild40ReservedProperties.aspx.

50 голосов
/ 21 января 2010

Вот 3 цели, которые полезны.

Где, конечно, я используюAmI, когда пытаюсь выяснить мой текущий каталог. Остальные также информативны. (Некоторые выходят за рамки вопроса).

<Target Name="WhereAmI">
    <Message Text=" Here I Am  " />
    <Exec Command="dir ." />
    <Message Text=" " />
</Target>



<Target Name="ShowReservedProperties" AfterTargets="BeforeBuild">  
    <Message Text=" MSBuildProjectDirectory  = $(MSBuildProjectDirectory)" Importance="high" />     
    <Message Text=" MSBuildProjectFile  = $(MSBuildProjectFile)" Importance="high" />   
    <Message Text=" MSBuildProjectExtension  = $(MSBuildProjectExtension)" Importance="high" />     
    <Message Text=" MSBuildProjectFullPath  = $(MSBuildProjectFullPath)" Importance="high" />   
    <Message Text=" MSBuildProjectName  = $(MSBuildProjectName)" Importance="high" />   
    <Message Text=" MSBuildBinPath  = $(MSBuildBinPath)" Importance="high" />   
    <Message Text=" MSBuildProjectDefaultTargets  = $(MSBuildProjectDefaultTargets)" Importance="high" />   
    <Message Text=" MSBuildExtensionsPath  = $(MSBuildExtensionsPath)" Importance="high" />     
    <Message Text=" MSBuildStartupDirectory  = $(MSBuildStartupDirectory)" Importance="high"/>
</Target>


  <Target Name="ShowOtherProperties">  
    <Message Text="  " />
    <Message Text="  " />
    <Message Text=" Environment (SET) Variables*       " />
    <Message Text=" ---------------------------        " />
    <Message Text=" COMPUTERNAME = *$(COMPUTERNAME)*   " />
    <Message Text=" USERDNSDOMAIN = *$(USERDNSDOMAIN)* " />
    <Message Text=" USERDOMAIN = *$(USERDOMAIN)*       " />
    <Message Text=" USERNAME = *$(USERNAME)*           " />
</Target>

Если вы используете «внешний файл msbuild» и вам необходимо передать имя файла или путь к нему (поскольку внешние файлы msbuild не любят относительные файлы, если они не находятся в той же папке, что и вызывающий файл .msbuild). ... вот удобное (на 3,5 и выше, мне кажется) задание.

    <ConvertToAbsolutePath Paths="..\"> <!-- Some relative path here -->
      <Output TaskParameter="AbsolutePaths" PropertyName="MyAbsolutionPathProperty"/>
    </ConvertToAbsolutePath>            
    <Message Text="'MyAbsolutionPathProperty' = '$(MyAbsolutionPathProperty)'" />   
11 голосов
/ 21 января 2010

MSBuild имеет зарезервированное свойство с именем MSBuildProjectDirectory, которое указывает на абсолютный путь к каталогу, в котором находится проект или файл сценария, C: \ Dev в вашем случае. Поэтому "$(MSBuildProjectDirectory)\temp" это именно то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...