web-dev-qa-db-ja.com

MSBuildスクリプトで現在のディレクトリを取得するにはどうすればよいですか?

MSBuildスクリプトでは、完全なディレクトリをパラメーターとして渡す必要があります。どうすれば入手できますか?

例:C:\ devからスクリプトを実行していて、相対パスtempが必要なので、C:\ dev\tempの後にいます。

注:スクリプトがどのフォルダーから実行されるかはわかりません。

64
Grzenio

イゴールはかなり近いです。 MSBuildProjectDirectoryは、コマンドラインで呼び出されたプロジェクトファイルへのフルパスを提供するプロパティです。したがって、次のスクリプトがある場合:

  • C:\ temp\MyProj.proj
  • C:\ shared\shared.targets

そしてMyProj.projshared.targetsをインポートし、これがmsbuild.exeに渡される場合、MSBuildProjectDirectoryの値は常にC:\ tempshared.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 を参照してください。

92

役立つ3つのターゲットを次に示します。

WhereAmIは、もちろん現在のディレクトリを見つけようとするときに使用するものです。他の情報も参考になります。 (質問の範囲を超えるもの)。

<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)'" />   
52
granadaCoder

MSBuildには、MSBuildProjectDirectoryという名前の予約済みプロパティがあります。これは、プロジェクトまたはスクリプトファイルが置かれているディレクトリの絶対パス(この場合はC:\ Dev)です。したがって、"$(MSBuildProjectDirectory)\temp"はまさにあなたが探しているものです。

11
Igor Korkhov