Nice programing

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

nicepro 2021. 1. 5. 21:09
반응형

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


<Message />상대 경로가 지정된 절대 경로를 작업 에서 평가하고 인쇄하도록 MSBuild를 얻으려면 어떻게 해야합니까?

부동산 그룹

<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>다른 스크립트에 삽입 된 경우에도 작동합니다 . 경로는 위의 코드를 포함하는 파일에 상대적입니다.

( Aaron의 답변Sayed의 답변 의 마지막 부분 에서 통합 )


MSBuild 3.5에서는 ConvertToAbsolutePath 작업을 사용할 수 있습니다 .

<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 를 사용할 수 있습니다 .

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

구문은 약간 못 생겼지 만 매우 강력합니다.


Wayne은 잘 알려진 메타 데이터가 속성에 적용되지 않고 항목에만 적용된다는 점을 옳습니다. "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 항목에서 ".. \ Desktop"을 "...... \ Public \ Server"로 바꾸면 모든 설정이 완료되어야합니다.


속성을 항목으로 변환해야하는 경우 두 가지 옵션이 있습니다. msbuild 2에서는 CreateItem 작업을 사용할 수 있습니다.

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

그리고 MSBuild 3.5를 사용하면 Task 내부에 ItemGroups를 가질 수 있습니다.

  <Target Name='Build'>
    <ItemGroup>
      <SRCDIR2 Include='$(Source_Dir)' />
    </ItemGroup>
    <Message Text="%(SRCDIR2.FullPath)" />
    <Message Text="%(SRCDIR.FullPath)" />
  </Target>

참조 URL : https://stackoverflow.com/questions/176931/how-can-i-get-msbuild-to-evaluate-and-print-the-full-path-when-given-a-relative

반응형