상대 경로가 주어지면 MSBuild가 전체 경로를 평가하고 인쇄하도록하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/176931

문제

MSBuild를 평가하고 인쇄 할 수있는 방법 <Message /> 과제 상대 경로가 주어진 절대 경로?

속성 그룹

<Source_Dir>..\..\..\Public\Server\</Source_Dir>
<Program_Dir>c:\Program Files (x86)\Program\</Program_Dir>

<Message Importance="low" Text="Copying '$(Source_Dir.FullPath)' to '$(Program_Dir)'" />

산출

''C : Program Files (x86) Program '에 복사

도움이 되었습니까?

해결책

MSBuild 4.0에서, 가장 쉬운 방법은 다음과 같습니다.

$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)\your\path'))

이 메소드는 스크립트가 있더라도 작동합니다 <Import>다른 스크립트로 ED; 경로는 위 코드를 포함하는 파일과 관련이 있습니다.

(통합 아론의 대답 뿐만 아니라 마지막 부분 Sayed의 대답)


MSBuild 3.5에서, 당신은 그것을 사용할 수 있습니다 TOABSOLUTEPATH 변환 직무:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         DefaultTargets="Test"
         ToolsVersion="3.5">
  <PropertyGroup>
    <Source_Dir>..\..\..\Public\Server\</Source_Dir>
    <Program_Dir>c:\Program Files (x86)\Program\</Program_Dir>
  </PropertyGroup>

  <Target Name="Test">
    <ConvertToAbsolutePath Paths="$(Source_Dir)">
      <Output TaskParameter="AbsolutePaths" PropertyName="Source_Dir_Abs"/>
    </ConvertToAbsolutePath>
    <Message Text='Copying "$(Source_Dir_Abs)" to "$(Program_Dir)".' />
  </Target>
</Project>

관련 출력 :

Project "P:\software\perforce1\main\XxxxxxXxxx\Xxxxx.proj" on node 0 (default targets).
  Copying "P:\software\Public\Server\" to "c:\Program Files (x86)\Program\".

당신이 나에게 묻는다면 약간의 바람이지만, 그것은 작동합니다. 이것은 "원래"프로젝트 파일과 관련이 있으므로 파일 내부에 배치 된 경우 <Import>Ed, 이것은 해당 파일과 관련이 없습니다.


MSBuild 2.0에서, ".."를 해결하지 않는 접근법이 있습니다. 그러나 그것은 절대적인 길처럼 행동합니다.

<PropertyGroup>
    <Source_Dir_Abs>$(MSBuildProjectDirectory)\$(Source_Dir)</Source_Dir_Abs>
</PropertyGroup>

그만큼 $ (msbuildProjectDirectory) 예약 된 속성은 항상이 참조를 포함하는 스크립트의 디렉토리입니다.

이것은 또한 "원래"프로젝트 파일과 관련이 있으므로 파일 내부에 배치 된 경우 <Import>Ed, 이것은 해당 파일과 관련이 없습니다.

다른 팁

MSBuild 4.0이 추가되었습니다 속성 기능 일부 .NET 시스템 DLL 중 일부에서 정적 기능으로 호출 할 수 있습니다. 속성 기능에 대한 정말 좋은 점은 대상의 측면을 평가한다는 것입니다.

전체 경로를 평가하려면 사용할 수 있습니다 system.io.path.getfullpath SO와 같은 속성을 정의 할 때 :

<PropertyGroup>
  <Source_Dir>$([System.IO.Path]::GetFullPath('..\..\..\Public\Server\'))</Source_Dir>
</PropertyGroup>

구문은 약간 추악하지만 매우 강력합니다.

웨인은 잘 알려진 메타 데이터가 속성에만 적용되지 않는다는 것이 맞습니다. "MSBuildProjectDirectory"와 같은 속성을 사용하면 작동하지만 전체 경로를 해결하기위한 내장 된 방법을 알지 못합니다.

또 다른 옵션은 상대적인 경로를 취하고 완전히 해결 된 경로를 뱉어내는 간단하고 맞춤형 작업을 작성하는 것입니다. 다음과 같이 보일 것입니다.

public class ResolveRelativePath : Task
{
    [Required]
    public string RelativePath { get; set; }

    [Output]
    public string FullPath { get; private set; }

    public override bool Execute()
    {
        try
        {
            DirectoryInfo dirInfo = new DirectoryInfo(RelativePath);
            FullPath = dirInfo.FullName;
        }
        catch (Exception ex)
        {
            Log.LogErrorFromException(ex);
        }
        return !Log.HasLoggedErrors;
    }
}

그리고 당신의 msbuild 라인은 다음과 같은 것처럼 보일 것입니다.

<PropertyGroup>
    <TaskAssembly>D:\BuildTasks\Build.Tasks.dll</TaskAssembly>
    <Source_Dir>..\..\..\Public\Server\</Source_Dir>
    <Program_Dir>c:\Program Files (x86)\Program\</Program_Dir>
</PropertyGroup>
<UsingTask AssemblyFile="$(TaskAssembly)" TaskName="ResolveRelativePath" />

<Target Name="Default">
    <ResolveRelativePath RelativePath="$(Source_Dir)">
    <Output TaskParameter="FullPath" PropertyName="_FullPath" />
    </ResolveRelativePath>
    <Message Importance="low" Text="Copying '$(_FullPath)' to '$(Program_Dir)'" />
</Target>

불가능한 속성을 통해 품목 메타 데이터 속성에 액세스하려고합니다. 당신이하고 싶은 것은 다음과 같습니다.

<PropertyGroup>
  <Program_Dir>c:\Program Files (x86)\Program\</Program_Dir>
</PropertyGroup>
<ItemGroup>
   <Source_Dir Include="..\Desktop"/>
</ItemGroup>     
<Target Name="BuildAll">
   <Message Text="Copying '%(Source_Dir.FullPath)' to '$(Program_Dir)'" />
</Target>

다음과 같이 출력을 생성합니다.

 Copying 'C:\Users\sdorman\Desktop' to 'c:\Program Files (x86)\Program\'

(스크립트는 내 문서 폴더에서 실행되었으므로 .. Desktop은 데스크탑에 도달하기위한 올바른 상대 경로입니다.)

귀하의 경우, Source_dir 항목의 ".....

속성을 항목으로 변환 해야하는 경우 두 가지 옵션이 있습니다. MSBuild 2를 사용하면 사용할 수 있습니다 CreateItem 직무

  <Target Name='Build'>
    <CreateItem Include='$(Source_Dir)'>
      <Output ItemName='SRCDIR' TaskParameter='Include' />
    </CreateItem>

그리고 MSBuild 3.5를 사용하면 작업 내부에 항목 그룹을 가질 수 있습니다.

  <Target Name='Build'>
    <ItemGroup>
      <SRCDIR2 Include='$(Source_Dir)' />
    </ItemGroup>
    <Message Text="%(SRCDIR2.FullPath)" />
    <Message Text="%(SRCDIR.FullPath)" />
  </Target>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top