2010-08-09 9 views
3

저는 최근에 수백 가지의 서로 다른 응용 프로그램이 모두 자신의 "사일로 (silos)"에 국한되어있는 엔터프라이즈 소프트웨어 환경에서 작업하기 시작했습니다. 내 임무 중 하나는 약간 표준화하려고 시도하는 것이며, 첫 번째 시도는 표준 이벤트 로깅입니다. 현재이 회사의 "표준"은 "모두가 로깅을 위해 엔터프라이즈 라이브러리를 사용해야합니다."입니다. 이것은 실제로 다른 프로젝트에서 작업하는 여러 개발자가 서로 다른 방식으로 서로 다른 로깅을 구현하고 대부분의 경우 해당 라이브러리를 사용한다는 것입니다.TFS 프로젝트는 서로를 참조 할 수 있습니까?

이 목적을 위해 내부적으로 개발 된 "회사 표준"의 배경에 실제 로깅 도구를 추상화하려고합니다. 아이디어는 구현 도구에서 "표준"이 벗어나고 어떻게 사용되는지에 초점을 맞추는 것입니다. 그런 다음 응용 프로그램은 내부 라이브러리를 사용하고 백그라운드에서 도구를 사용하지 않을 것입니다 (app.config 섹션을 제외하고 log4net으로 추상화하는 방법을 이미 알고 있습니다).

그러나 지금 당면한 문제는 이러한 모든 응용 프로그램이 별도의 TFS 프로젝트에 있다는 것입니다. 로깅을위한 공통 라이브러리가 포함 된 프로젝트를 만들면 다른 프로젝트가 참조 할 수있는 방법이 있습니까? 각 프로젝트간에 라이브러리를 배포하고 싶지는 않습니다. 왜냐하면 라이브러리가 빨리 동기화되지 않기 때문입니다.

TFS가이 작업을 수행 할 수 없으면 다른 제안이 있습니까?

+0

http://stackoverflow.com/questions/3385282/ 가능한 중복 msvs-2010/3390190 # 3390190 – Robaticus

+0

@Robaticus : 나는 실제로 그 하나를 발견하지 못했습니다. 감사합니다. 언뜻보기에 거기에있는 질문자가 우리보다 약간 다른 방식으로 TFS를 사용하고있는 것처럼 보입니다. 그리고 그 대답은 우리의 환경에 대한 유지 보수의 악몽으로 바뀔 수있는 해킹 같은 것 (빠른 눈으로, 어쨌든)으로 들리기 때문에 약간의 조사를 할 것입니다 : ( – David

+0

나는 응답자였습니다. 솔루션 1은 공유 디렉토리 였고 해결책 2는 표시된 방법이었습니다. 공유 디렉토리는 성공적인 빌드 후에 TFS에서 업데이트됩니다. 우리가 배운 것을 감안할 때 2010 년으로 넘어 가면 공유 디렉토리 접근 방식을 조사 할 것입니다. . – Robaticus

답변

4

TFS에는 "공유 된"폴더 개념이 없습니다 (예 : Visual SourceSafe와 유사). 작업 공간은 유연성을 제공하지만 동일한 "공유"폴더를 두 개 이상의 프로젝트에 매핑하려고하면 바로 중단됩니다. 특정 상황을 해결할 수있는 몇 가지 옵션이 있습니다.

  1. 로깅 프로젝트를 필요로하는 각 팀 프로젝트로 분기하십시오. 로깅 프로젝트를 변경하면 A)으로 분기해야하는 각 프로젝트 ("푸시") 또는 에 로깅 프로젝트 변경 내용을 병합해야합니다. B)은 각 프로젝트 팀에서 사용하도록 요청합니다. 로깅 변경 사항은 병합을 수행하여 최신 변경 사항을 가져옵니다 ("pull").

  2. 로깅 프로젝트의 자동화 된 빌드 프로세스의 일부로 잘 알려진 위치에 바이너리를 게시하십시오. 로깅 바이너리 설정을 요구하는 각 프로젝트에 미리 빌드 이벤트가 아닌 - 또는 - 로깅 바이너리의 최신 버전을 복사하는 미리 빌드 이벤트가 있으면 자동 빌드 프로세스에서 현재 버전을 얻을 수도 있습니다 로깅 바이너리를 솔루션에 추가합니다 (필요에 따라 체크 아웃/기능 수행).

다른 해결책이있을 수 있습니다 (일반적으로 있음)하지만 그게 모두 꺼림칙합니다.

희망이 도움이됩니다.

+0

네. http://stackoverflow.com/questions/3385282/best-practice-to-share-projects-between-solution-trees-msvs-2008-msvs-2010/3390190#3390190 – Robaticus

+0

에서 해당 옵션에 대해 설명했습니다. 지금까지 모든 사람들의 반응을 바탕으로이 두 가지가 기본 옵션이라는 것을 알았습니다. 솔직히 말해서이 환경에 대한 내 경험에 기반합니다 (이전에 작업 한 환경과는 매우 다릅니다) , 두 가지 옵션 시간이 지남에 따라 문제가 발생할 확률이 높아지면서 여기에서 유지하기가 어려울 것 같은 소리입니다. 대부분이 빌드/배포 프로세스가 _mess_라는 사실에 기반합니다. (내가 고치려는 다른 것.) – David

+1

자동화 된 프로세스로 인해 재난이 발생한다고 생각합니다. 귀하의 API/툴이 6 개의 프로젝트에서 사용되고 그 중 하나가 주요한 변화가 필요하고 그것을 구현한다고 상상해보십시오. 다음으로 5 개의 다른 프로젝트를 빌드하면 "kaboom"이됩니다. 대신 모든 의존 도구와 API를 버전 관리하고 소스 제어에서 @RyanCromwell으로 대답하도록하십시오. –

0

우리가 성공한 것은 로깅과 같은 라이브러리 프로젝트가 포함 된 솔루션으로 별도의 TFS 프로젝트를 만드는 것입니다. 이 솔루션을 구축 할 때 어셈블리를 서버의 공유 드라이브에 배포합니다. 이 라이브러리 중 하나를 사용해야 할 때 서버의 해당 위치를 탐색하여 어셈블리에 대한 참조를 추가하기 만하면됩니다. 이러한 라이브러리 중 하나를 변경해야하는 경우 언제든지 변경할 수 있습니다. 다음 번에 어셈블리를 사용하는 프로젝트 중 하나가 빌드되면 새 버전으로 업데이트됩니다.

5

제프의 제안은 우리가 권장하는 것 중 가장 가까운 것입니다.다른 프로젝트를 클라이언트로 제공하는 별도의 팀 프로젝트 인 내부 API를 고려하십시오. 이 프로젝트는 백 로그와 릴리스주기를 제공합니다. CI, Beta 및 Release 빌드를 원하는대로 만들 수 있습니다. 소비/소비 프로젝트는 자신의 출시주기에 적절하게 수용 할 수 있도록 선택한 빌드를 사용합니다. TFS 빌드가 사용 가능하게 된 드롭 위치로 이동하기 때문에 사람들은 새로운 릴리스를 푸는 대신 끌어 당깁니다. 잡아 당기기를 선택하고 해당 어셈블리를 소비 프로젝트 내에서 체크인하고 버전을 제어해야합니다 (). 이것은 진정한 제 3 자 어셈블리와 다를 바 없으며 사실 동일한 고려 사항에서 이것을 고려해야합니다.

최신 버전의 내부 어셈블리로 업그레이드하기 위해 소모하는 응용 프로그램이 필요 또는 대역폭을 필요로 할 때 당겨집니다.

-1

업데이트 할 때마다 모든 핵심 라이브러리를 GAC에 배포하면 응용 프로그램이 GAC에서 최신 상태로 유지됩니다. 명령을 사용하여 GAC를 모든 "서버/워크 스테이션"에 쉽게 푸시 할 수 있습니다. DLL에있는 모든 Public 메서드의 서명을 일정하게 유지해야합니다. 그렇지 않으면 라이브러리를 변경할 때 개발자가 해당 메서드를 참조하는 경우 오류가 발생합니다 (해당 메서드를 참조하는 경우)

+1

GAC를 포괄적 인 배포 도구로 사용하는 것은 전역 변수를 포괄적 인 상태 관리로 사용하는 것과 같습니다. 또한이 방법은 소스 *에서 서로 참조하는 프로젝트의 문제를 해결하지 못합니다. 코드를 컴파일하기 전에 개발자가 워크 스테이션에 더 많은 것을 설치해야하는 외부 수동 ​​단계가 도입되었습니다. – David

+0

제발 그렇게하지 마십시오. 공용 라이브러리 dll을 모든 사용자가 참조 할 수있는 공유 네트워크 위치에 배포하십시오. 또는 버전 관리에 신경 쓰면 로컬 NuGet 저장소를 배포하고 패키지의 기능을 마무리하십시오. GAC에서 생성하게 될 진흙 구슬은 다루기가 힘듭니다. – Adrian

관련 문제