2017-02-15 6 views
2

나는 여기에서 뭔가를 간과했으면 좋겠다. 그러나 나는 행복하게 해결할 수없는 문제에 부딪혔다.펑 토이 드가 GAC에 있어야합니까?

CI 솔루션에 VSTS를 사용하고 있습니다. 각 커밋은 BizTalk 응용 프로그램을 전용 빌드 서버로 가져 와서 컴파일하고 단위 테스트가 실행됩니다.

Visual Studio가 프로젝트 참조가 아닌 컴파일로 컴파일되기 때문에 내 BizTalk 솔루션 어셈블리를 빌드 서버의 GAC로 가져 오는 것을 원하지 않습니다.

Functoid not found: guid (1d5de785-c639-4040-9704-c65a11127115) with functoid id (6003). Check if the assembly implementing this functoid is present in D:\Program Files (x86)\Microsoft BizTalk Server 2013 R2\Developer Tools\Mapper Extensions. If the functoid does not expose any inline code, make sure its assembly is made available in the GAC also

그래서, 펑 토이 어셈블리가 GAC에 있어야합니다 :

문제는 빌드 에이전트가 사용자 지정 펑 토이 프로젝트, 나는 다음과 같은 오류를 포함하는 솔루션을 구축하려고 할 때 온다? 문제는, common.components 어셈블리를 참조하는 것인데, 이는 또한 GAC가 될 필요가 있다는 것을 의미합니다. 이것은 내가 원하지 않는 곳으로 바로 돌아 가게합니다! 이는 다음 번에 빌드 에이전트가 common.components에 대한 참조를 사용하여 프로젝트를 빌드하려고 할 때 GAC에서 실행되는 "이전"버전을 사용하기 때문에 오히려 최신 버전을 가져온 것이므로 repo와 같은 솔루션에서 종속 프로젝트 옆에 앉았습니다.

다른 사람이 같은 문제에 부딪혔다면, 저는 여러분의 의견을 듣고 싶습니다.

call "$(DevEnvDir)..\tools\vsvars32.bat" 
gacutil.exe /if "$(TargetPath)" 

내가 $(DevEnvDir) 비록 빌드 서버에 해결되지 않습니다 꽤 확신 :

+0

내가 올바른 해결책이 곳의 모든 BizTalk 응용 프로그램 관련 어셈블리가해야되는 GAC를 업데이트하는 것입니다 말을하려고 해요 :

나는하여 Common.Components 프로젝트에 대한 포스트 빌드 이벤트로 다음을 추가 항상 그렇습니다. 그것이 작동하는 방법입니다. "BizTalk 프로젝트가 프로젝트 참조가 아닌 .NET 참조를 사용하는 것 같습니다 .Net이 어셈블리를 해결하는 방법입니다. BizTalk와 관련이 없습니다. –

+0

@ Johns-305 답변 주셔서 감사합니다. 어셈블리 해상도가 BizTalk (https://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.110).aspx)와 아무런 관련이 없음을 동의합니다.그러나 GAC에 있어야하는 펑 토이 드 (functoids)가이 문제의 원인입니다. 사용자 정의 펑 토이도없고 문제 없습니다! common.components가 GAC에 있으면 커밋이 자동 빌드를 트리거 할 때마다 빌드 서버에서 "이전"버전이 참조됩니다. 빌드 에이전트는 원격 Repo에서 common.components에 대한 최신 코드를 가져 오지만 종속 프로젝트는 GAC에있는 모든 버전을 사용하여 빌드됩니다. –

+2

미안하지만 여전히 문제가 발생하지 않습니다. 빌드는 필요한 모든 것을 갱신해야합니다. GAC에는 '구식'버전이 없어야합니다. 또한 빌드 타임에 자연스럽게 또는 특정 빌드 단계로 업데이트해야합니다. –

답변

0

답변으로 @ Johns-305에게 감사드립니다. 저는이 것을 과소 평가했습니다!

"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\gacutil.exe" /i "$(TargetPath)" 
1

나는 일반적으로 빌드 후 단계로 내 BizTalk 관련 프로젝트에 다음과 같은 것을 넣어. 몇 가지 해결 방법이 있습니다 - Windows SDK를 설치하고 적절한 레지스트리 키 (예 : Running MSBuild fails to read SDKToolsPath)를 설정하거나 그렇지 않으면 gacutil에 대한 경로가있는 빌드 서버에서 환경을 설정할 수 있습니다. 은 MSBuild 커뮤니티 작업 GacUtil 작업을 가지고, 혹은 심지어 같은 파워 쉘 스크립트를 실행 (https://github.com/loresoft/msbuildtasks) 같은 것을 사용할 수 있습니다

#Note that you should be running PowerShell as an Administrator 
[System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")    
$publish = New-Object System.EnterpriseServices.Internal.Publish    
$publish.GacInstall("C:\Path\To\DLL.dll") 

(https://www.andrewcbancroft.com/2015/12/16/using-powershell-to-install-a-dll-into-the-gac/에서).

성공적인 GAC 라이브러리를 구축하려면 빌드 프로세스가 (로컬) 관리자 권한으로 실행해야합니다.

편집 :이 문제는 로컬에서 실행되었으므로 테스트를 거친 모든 환경에서 작동합니다 (어떤 Windows SDK가 설치되어 있는지 또는 컴퓨터의 관리자가 컴퓨터에 설치했는지 여부에 관계없이). C, D 또는 다른 드라이브 ...) :

powershell -c "[System.Reflection.Assembly]::Load('System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'); $publish = New-Object System.EnterpriseServices.Internal.Publish; $publish.GacInstall('$(TargetPath)');"