상대 경로가 주어 졌을 때 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>
'Nice programing' 카테고리의 다른 글
Tomcat 8은 '|'로 요청 받기를 처리 할 수 없습니다. (0) | 2021.01.05 |
---|---|
파일 버전 및 어셈블리 버전을 사용하는 가장 좋은 방법은 무엇입니까? (0) | 2021.01.05 |
StreamWriter 및 UTF-8 바이트 순서 표시 (0) | 2021.01.05 |
C # 시간 범위 밀리 초 대 TotalMilliseconds (0) | 2021.01.05 |
LibGDX (Java)에서 좌표계 변경 (0) | 2021.01.05 |