2017-10-10 6 views
0

bat 스크립트에서 csproj이 아닌 MSBuild 스크립트를 호출하고 있습니다. 그 스크립트가 MSBuild Community Tasks을 사용할 수 있기를 바랄뿐입니다. 모든 머신에이 스크립트를 설치하고 싶지 않고, 내 저장소에 바이너리를 포함하고 싶지도 않습니다.별도의 호출없이 독립 실행 형 MSBuild 스크립트에서 NuGet 대상을 사용하는 방법

이 노드를 스크립트에 추가하고 restore 대상을 호출하면 패키지가 복원됩니다.

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
<ItemGroup> 
    <PackageReference Include="MSBuildTasks"> 
    <Version>1.*</Version> 
    </PackageReference> 
</ItemGroup> 

포함 된 작업을 사용하려면 해당 항목 만 사용해야합니다.

<Target Name="MyTarget" DependsOnTargets="Restore"> 
    <AssemblyInfo CodeLanguage="CS" 
        OutputFile="$(VersionInfoFile)" 
        AssemblyVersion="1.2.3.5" 
        /> 
</Target> 

그러나, 나는 내 스크립트를 실행 처음으로, 패키지가 복원 만이 AssemblyInfo 작업을 찾을 수 없기 때문에 다음 스크립트가 실패 : 어떤 다른 targets 파일을 가져올 필요가 없습니다. 두 번째로 성공합니다. MSBuild 스크립트를 두 번 호출하지 않고이 작업을 수행 할 수있는 방법이 있습니까 (처음으로 Restore 타겟을 실행하는 경우)?

답변

1

글로벌 속성 (!)이 다른 <MSBuild> 작업을 사용하여 msbuild 파일을 호출하여 NuGet에서 생성 한 가져 오기를 강제로 다시 평가할 수 있습니다.

<Target Name="MyTarget" DependsOnTargets="Restore"> 
    <MSBuild Projects="$(MSBuildProject)" Targets="MyTargetCore" Properties="Foo=Bar" /> 
</Target> 

<Target Name="MyTargetCore"> 
    <AssemblyInfo CodeLanguage="CS" 
        OutputFile="$(VersionInfoFile)" 
        AssemblyVersion="1.2.3.5" 
        /> 
</Target> 

상황 (솔루션 구축, 프로젝트 참조)에 따라, 또는 Properties="Foo=Bar" 부분없이 작동하지 않을 수 있습니다.

그러나 모든 msbuild 캐시가 MSBuild 작업의 인수를 사용하여 지울 수있는 것은 아니기 때문에 약간 위험합니다. MSBuild 15.5는 Restore 대상을 실행할 /restore 스위치를 추가하고 필요한 모든 캐시를 지운 다음 다른 요청한 작업을 수행합니다. 따라서 15.5에서 어려움없이 msbuild /restore /t:MyTarget에 전화 할 수 있어야합니다.