2017-01-11 15 views
1

VS 2015가 설치된 여러 개발자 컴퓨터에서 작동하는 클릭 솔루션이 있습니다. 그러나이 signFile 오류와 함께 제공되는 빌드 서버에서는 작동하지 않습니다. 나는오류 MSB4018 : 빌드 서버에서 "SignFile"작업이 예기치 않게 실패했습니다

  • 빌드 도구 2015 업데이트 3
  • 닷넷을 설치 한 4.6.2 SDK
  • Windows 소프트웨어 개발 키트

그러나 Apparantly 히 signtool.exe의 경로가 제대로 설정되지 않습니다 . 매니페스트 서명을 사용 중지하면 계속 진행되지만 setup.bin 누락 오류가 발생합니다.

누구나 SignFile 문제를 해결하는 방법을 알고 있습니까?

[_DeploymentComputeClickOnceManifestInfo] Using "SignFile" task from assembly "Microsoft.Build.Tasks.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". 
[_DeploymentComputeClickOnceManifestInfo] SignFile 
[SignFile] C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(3616, 5): error MSB4018: The "SignFile" task failed unexpectedly. 
System.ArgumentNullException: Value cannot be null. 
Parameter name: path1 
    at System.IO.Path.Combine(String path1, String path2, String path3) 
    at Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.GetPathToTool(ResourceManager resources) 
    at Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.SignPEFile(X509Certificate2 cert, Uri timestampUrl, String path, ResourceManager resources, Boolean useSha256) 
    at Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.SignFileInternal(X509Certificate2 cert, Uri timestampUrl, String path, Boolean targetFrameworkSupportsSha256, ResourceManager resources) 
    at Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.SignFile(X509Certificate2 cert, Uri timestampUrl, String path) 
    at Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilities.SignFile(String certThumbprint, Uri timestampUrl, String path, String targetFrameworkVersion) 
    at Microsoft.Build.Tasks.SignFile.Execute() 
    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() 
    at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext() 

답변

1

오류는 다음과 같은 방법 인 Microsoft.Build.Tasks.Deployment.ManifestUtilities.SecurityUtilitiesline 195에 발생되는 :

internal static string GetPathToTool() 
    { 
     string pathToDotNetFrameworkSdkFile = ToolLocationHelper.GetPathToDotNetFrameworkSdkFile(ToolName(), TargetDotNetFrameworkVersion.Version35); 
     if (pathToDotNetFrameworkSdkFile == null) 
     { 
      pathToDotNetFrameworkSdkFile = Path.Combine(Environment.CurrentDirectory, ToolName()); 
     } 
     if (!File.Exists(pathToDotNetFrameworkSdkFile)) 
     { 
      pathToDotNetFrameworkSdkFile = null; 
     } 
     return pathToDotNetFrameworkSdkFile; 
    } 

직접적인 원인은 Environment.CurrentDirectorynull을 반환하지만, 더 두드러진 하나 ToolLocationHelper.GetPathToDotNetFrameworkSdkFile(ToolName(), TargetDotNetFrameworkVersion.Version35)는 반환 된 것을이었다 null.

위의 코드는 클래스의 특정 버전의 전용 스냅 샷이지만, 하드 열거 값 TargetDotNetFrameworkVersion.Version35 문제가 빌드 도구 2015 업데이트 3는 닷넷 SDK의 다른 버전 이상에 의존한다는 것을 알려줍니다 4.6.2.

는 UPDATE :

이 특정 SDK 버전을 식별하는 데 도움이, 나는 https://github.com/Microsoft/msbuild/releases에 업데이트 3 릴리스에서 소스 코드를 아래로 당겼다. 용액에 더 파고

internal static string GetPathToTool(System.Resources.ResourceManager resources) 
    { 
#pragma warning disable 618 // Disabling warning on using internal ToolLocationHelper API. At some point we should migrate this. 
     string toolPath = ToolLocationHelper.GetPathToWindowsSdkFile(ToolName, TargetDotNetFrameworkVersion.VersionLatest, VisualStudioVersion.VersionLatest); 
     if (toolPath == null) 
      toolPath = ToolLocationHelper.GetPathToWindowsSdkFile(ToolName, TargetDotNetFrameworkVersion.Version45, VisualStudioVersion.Version110); 
     if (toolPath == null) 
      toolPath = Path.Combine(ToolLocationHelper.GetPathToDotNetFrameworkSdk(TargetDotNetFrameworkVersion.Version40, VisualStudioVersion.Version100), "bin", ToolName); 
     if (toolPath == null) 
      toolPath = Path.Combine(Directory.GetCurrentDirectory(), ToolName); 
     if (!File.Exists(toolPath)) 
      throw new ApplicationException(String.Format(CultureInfo.CurrentCulture, resources.GetString("SecurityUtil.SigntoolNotFound"), toolPath)); 
     return toolPath; 
#pragma warning restore 618 
    } 

, 나는 빌드 도구의 최신 버전 (이 설치 한) 프레임 워크 4.6.2에 대한 지원이 추가 그 changeShared\FrameworkLocationHelper.cs에 포함되지 않는 것으로 결정했다. 따라서 후속 질문에 대답하려면 4.6.1 SDK를 설치하는 것이 트릭을 수행해야합니다.

UPDATE 2 :

영업 대안 솔루션을 식별 명시 적으로 예를 들어, TargetFrameworkSDKToolsDirectory 속성 값을 설정 명령 행에서 msbuild.exe을 호출 할 때 /p:TargetFrameworkSDKToolsDirectory=PATH TO SIGNTOOL.EXE(?)을 인수로 추가하십시오.

+1

당신이 어떻게 알아 냈는지 모르겠지만, 고마워요. 어떤 SDK가 종속되어 있는지 알 수 있습니까? 그래서 모두 설치할 필요가 없습니까? 지금은 속성/속성 : TargetFrameworkSDKToolsDirectory를 호출하여 msbuild를 호출하여이 문제를 피할 수있었습니다. –

+0

답변이이 정보로 업데이트되었습니다 (필자가 올바르게 되었길 바랍니다!). 내가 어떻게 알아 낸지에 관해서는, 오류 로그의 상단 부근에서 참조 된 파일 및 행 번호로 이동하여 시작했습니다. 'SignFile' 작업이 도구/실행 파일의 경로에 대한 매개 변수를 사용하지 않는 것을 보았을 때, 나는'SignFile' 작업을위한 소스 코드를 볼 필요가 있음을 알았습니다. 운좋게도 MSBuild는 이제 오픈 소스입니다! – weir

+0

@dennis_ler -이 답변에'TargetFrameworkSDKToolsDirectory' 수정 사항을 추가했습니다. – weir