약 100 개 이상의 프로젝트가 포함 된 솔루션이 있습니다. 대부분은 C #입니다. 당연히 개봉하고 구축하는 데 시간이 오래 걸리므로 그런 짐승에 대한 모범 사례를 찾고 있습니다. 답변을 얻고 자하는 질문에는 다음과 같은 것들이 있습니다.
- 프로젝트 간의 참조를 가장 잘 처리하는 방법
- “로컬 복사”가 켜져 있거나 꺼져 있어야합니까?
-
모든 프로젝트가 자체 폴더에 빌드되어야하는지 아니면 모두 동일한 출력 폴더에 빌드되어야합니까 (모두 동일한 애플리케이션의 일부 임)
-
솔루션 폴더가 물건을 정리하는 좋은 방법입니까?
솔루션을 여러 개의 작은 솔루션으로 분할하는 것이 옵션이라는 것을 알고 있지만 자체 리팩토링 및 구축 문제가 있으므로 별도의 스레드에 대해 저장할 수 있습니다. 🙂
답변
내가 작성한이 두 MSBuild 문서에 관심이있을 수 있습니다.
MSBuild : 신뢰할 수있는 빌드를 만들기위한 모범 사례, 1 부
MSBuild : 안정적인 빌드를 만들기위한 모범 사례, 2 부
특히 Part 2에는 살펴 볼만한 대형 소스 트리 구축 섹션 이 있습니다.
여기에서 귀하의 질문에 간략하게 답변하려면 :
- CopyLocal? 확실히 이거 끄세요
- 하나 이상의 출력 폴더에 빌드 하시겠습니까? 하나의 출력 폴더로 빌드
- 솔루션 폴더? 이것은 맛의 문제입니다.
이브라힘 하시 미
내 책 : Microsoft Build Engine 내부 : MSBuild 및 Team Foundation Build 사용
답변
항목을 정리하는 데 도움이되는 솔루션 폴더를 절약 하려면 +1하십시오 .
프로젝트를 자체 폴더에 구축하려면 +1합니다. 우리는 처음에 공통 출력 폴더를 시도했으며 이로 인해 오래된 참조를 찾는 것이 미묘하고 고통 스러울 수 있습니다.
FWIW에서는 솔루션에 대한 프로젝트 참조를 사용합니다. 요즘에는 nuget이 더 나은 선택 일 수 있지만 svn : externals는 타사 및 (프레임 워크 유형) 사내 어셈블리 모두에서 잘 작동한다는 사실을 발견했습니다. svn : externals를 참조 할 때 HEAD 대신 특정 개정 번호를 사용하는 습관을들이십시오 (유죄 :).
답변
자주 사용하지 않는 프로젝트를 언로드하고 SSD를 구입하십시오. SSD는 컴파일 시간을 향상시키지 않지만 Visual Studio는 열기 / 닫기 / 빌드가 두 배 더 빨라집니다.
답변
우리는 109 개의 개별 프로젝트를 처리해야하는 것과 비슷한 문제가 있습니다. 경험을 바탕으로 한 원래 질문에 답하려면 :
1. 프로젝트 간의 참조를 가장 잘 처리하는 방법
‘참조 추가’컨텍스트 메뉴 옵션을 사용합니다. ‘프로젝트’를 선택하면 기본적으로 단일 글로벌 솔루션 파일에 종속성이 추가됩니다.
2. “로컬 복사”를 설정하거나 해제해야합니까?
우리의 경험에서 벗어났습니다. 추가 복사는 빌드 시간을 추가합니다.
3. 모든 프로젝트가 자체 폴더에 빌드되어야하거나 모두 동일한 출력 폴더에 빌드되어야합니까 (모두 동일한 애플리케이션의 일부 임)
모든 출력은 ‘bin’이라는 단일 폴더에 저장됩니다. 이 폴더는 소프트웨어가 배포 될 때와 동일하다는 생각입니다. 이렇게하면 개발자 설정이 배포 설정과 다를 때 발생하는 문제를 방지 할 수 있습니다.
4. 솔루션 폴더가 항목을 구성하는 좋은 방법입니까?
우리 경험으로는 아닙니다. 한 사람의 폴더 구조는 다른 사람의 악몽입니다. 깊이 중첩 된 폴더는 항목을 찾는 데 걸리는 시간을 증가시킵니다. 우리는 완전히 평평한 구조를 가지고 있지만 프로젝트 파일, 어셈블리 및 네임 스페이스의 이름을 동일하게 지정합니다.
프로젝트를 구조화하는 방법은 단일 솔루션 파일에 의존합니다. 프로젝트 자체가 변경되지 않았더라도이를 구축하는 데 오랜 시간이 걸립니다. 이를 돕기 위해 일반적으로 다른 ‘현재 작업 집합’솔루션 파일을 만듭니다. 우리가 작업중인 모든 프로젝트가 여기에 추가됩니다. 빌드 시간이 크게 개선되었지만 현재 세트에없는 프로젝트에 정의 된 유형에 대해 Intellisense가 실패한다는 문제점이 있습니다.
솔루션 레이아웃의 일부 예 :
\bin
OurStuff.SLN
OurStuff.App.Administrator
OurStuff.App.Common
OurStuff.App.Installer.Database
OurStuff.App.MediaPlayer
OurStuff.App.Operator
OurStuff.App.Service.Gateway
OurStuff.App.Service.CollectionStation
OurStuff.App.ServiceLocalLauncher
OurStuff.App.StackTester
OurStuff.Auditing
OurStuff.Data
OurStuff.Database
OurStuff.Database.Constants
OurStuff.Database.ObjectModel
OurStuff.Device
OurStuff.Device.Messaging
OurStuff.Diagnostics
...
[etc]
답변
우리는 여기서 비슷한 대규모 프로젝트를 진행합니다. 솔루션 폴더는 사물을 정리하는 좋은 방법임이 입증되었으며 로컬 복사를 true로 설정하는 경향이 있습니다. 각 프로젝트는 자체 폴더에 빌드되며, 배포 가능한 각 프로젝트에 대해 올바른 바이너리 하위 집합이 있습니다.
시간 개방과 시간 구축에 관해서는 더 작은 솔루션으로 나누지 않고는 고치기가 어려울 것입니다. 여기서 속도를 향상시키기 위해 빌드 병렬화 (이 작업을 수행하고 UI에 통합하는 방법에 대해 Google “Parallel MS Build”)를 조사 할 수 있습니다. 또한 디자인을 살펴보고 일부 프로젝트를 리팩토링하여 전체적으로 더 적은 수의 결과를 얻을 수 있는지 확인하십시오.
답변
빌드 문제를 완화하는 측면에서 빌드에 “구성 관리자 …”옵션을 사용하여 특정 프로젝트 빌드를 활성화 또는 비활성화 할 수 있습니다. 특정 프로젝트를 제외하고 특정 프로젝트를 대상으로 할 때 사용할 수있는 “프로젝트 [n] 빌드”를 가질 수 있습니다.
100 개 이상의 프로젝트가 진행되는 한, 솔루션 크기를 줄이는 이점에 대해이 질문에 당황하고 싶지 않다는 것을 알고 있지만로드 시간을 단축하는 데는 다른 옵션이 없다고 생각합니다. 메모리 사용량) devenv.
답변
일반적으로이 작업은 “디버그”프로세스가 실제로 어떻게 발생하는지에 따라 다릅니다. 일반적으로 copy local을 true로 설정하지 않습니다. 각 프로젝트의 빌드 디렉토리를 설정하여 모든 것을 원하는 끝점으로 출력합니다.
따라서 각 빌드 후에는 모든 dll 및 모든 Windows / 웹 응용 프로그램으로 채워진 폴더가 있으며 모든 항목이 적절한 위치에 있습니다. dll이 결국 올바른 위치에 있기 때문에 로컬 복사가 필요하지 않았습니다.
노트
위의 내용은 일반적으로 웹 응용 프로그램 인 내 솔루션에 적용되며 참조 관련 문제는 경험하지 않았지만 가능할 수 있습니다!