c# 패턴 공통 프로젝트를.NET MVC의 변형 된 빌드와 병합




microsoft asp net mvc3 download (5)

나는 많은 다른 고객에게 게시되어야하는 .net mvc 사이트를 가지고 있으므로 대상에 따라 약간 다릅니다.

핵심 프로젝트 구조를 설정할 수있는 방법이 있습니까 (예 : (단순화)) :

  • views
  • 모델
  • 컨트롤러
  • 자산
  • 큰 상자

현재 타겟이 가질 수있는 모든 변형과 함께 빌드 타임에 병합을 수행하십시오. 예 :

핵심 프로젝트 :

  • views
    • view1.cshtml
    • view2.cshtml

(간결함을 위해 나머지 폴더를 제거함)

고객 1 표적 :

  • views
    • view2.cshtml
    • view3.cshtml

원하는 병합 결과 :

  • views
    • view1.cshtml (핵심 프로젝트에서)
    • view2.cshtml (고객 1 타겟에서)
    • view3.cshtml (고객 1 타겟에서)

같은 규칙이 컨트롤러, 바이너리 등에 적용되어야한다.


여기에 정말 좋은 코드 응답이 있습니다. 그러나 모든 클라이언트에 대해 자동화 된 빌드 시스템을 원하고로드가 있으면 설치가 너무 어려울 수 있습니다. 당신이 이것을 할 수있는 Powershell을위한 스크립트를 설정할 수있을 때

의사 코드

For each client site
    download base code to code/
    download this client's changes to code/ overwriting files
    msbuild ....
    copy client/ bin to build/client/
    Delete code/
End For each

마음에 가장 먼저 떠오르는 것은 (추가 툴링이 필요 없기 때문에 가장 쉽다) 핵심 기능, 뷰 및 컨트롤러가있는 핵심 프로젝트를 만드는 것입니다. 또한 각 고객은 사용자 정의보기 및 컨트롤러가있는 별도의 프로젝트를 만듭니다. 그런 다음 고객 별 프로젝트의 경우 핵심 프로젝트의 모든 필수 파일을 링크하기 만하면됩니다. 번호에 따라 파일을 링크하는 것은 다소 지루할 수 있지만 수행 가능한 것처럼 보입니다.

또 다른 접근 방법은 CAKEFAKE 와 같은 도구를 사용하는 것입니다. 도움을 받아 원하는 빌드 방식으로 전체 빌드 프로세스를 스크립팅 할 수는 있지만 이러한 사용자 지정 스크립팅을 직접 해보지는 않았습니다.

세 번째 옵션은 정의 된 상수를 기반으로 파일을 조건부로 포함시키는 것이지만 * .csproj 파일을 편집해야합니다. 코드는 다음과 같을 수 있습니다.

<Content Include="Views\View1.cshtml" />
<Content Include="Views\View2.cshtml" Condition="$(DefineConstants.Contains('CORE'))" />
<Content Include="Views\View2.cshtml" Condition="$(DefineConstants.Contains('CUSTOMER1'))" />
<Content Include="Views\View3.cshtml" Condition="$(DefineConstants.Contains('CORE'))" />
<Content Include="Views\View3.cshtml" Condition="$(DefineConstants.Contains('CUSTOMER1'))" />

확실히 유지하는 것이 얼마나 쉬운 지 확신하지 못합니다.

아마도 응용 프로그램을 독립 구성 요소 / 구성 요소와 관련된 모든 기능을 포함하는 프로젝트로 분할하는 것을 고려할 것입니다. 빌드 도중 특정 클라이언트에 필요한 구성 요소를 기반으로 FAKE를 사용하여 구성 요소를 작성합니다.


나도 여러 프로젝트, 너겟을 사용하거나 소스 컨트롤을 사용합니다. 나는 아래의 아이디어에 대해서 이야기 할 것이나 특별한 순서는 말할 필요가 없다. 결국 나는 둘 중 하나에 대한 선호도를 포함 할 수 있습니다.

제가 이야기 할 첫 번째 아이디어는 여러 프로젝트를 사용하는 것입니다. 기본 프로젝트를 만들고 WebBase라고 부르 자. 당신이 말한 핵심 웹 사이트를 만드십시오. 다음으로 Customer1 웹 사이트를 만듭니다. 비어있는 웹 사이트로 Customer1을 만들면 WebBase의 폴더 구조를 다시 만들어야합니다. 그렇지 않으면 WebBase에서와 동일한 방식으로 폴더를 만들고 모든 파일을 제거합니다 (Visual Studio에서이 작업을 수행하십시오). 어떤 방법 으로든 파일이없는 폴더 구조로 끝납니다. web.config, packages.config, AssemblyInfo.cs와 함께 Properties 폴더를 유지하는 것이 좋습니다. 그런 다음 WebBase에서 파일을 추가하지만 정상적으로 추가하지는 마십시오. 예를 들어 홈 인덱스 뷰를 살펴 보겠습니다. Customer1의 뷰 폴더를 확장하고, 집에서 마우스 오른쪽 버튼을 클릭하고, 추가 항목을 선택하고, Extending Item을 선택하고, Customer1을 탐색 한 다음 WebBase / Views / Home을 탐색하고, index.cshtml을 클릭하십시오. 버튼에서 드롭 다운을 확인 하시겠습니까? 그것을 클릭하고 "링크로 추가"를 선택하십시오. 이제 WebBase의 모든 파일에 대해이 작업을 수행하십시오! 매번 "링크로 추가"를 선택하는 것이 번거로울 것입니다 만, 단지 추가를 클릭하면 파일을 복사하고 업데이트가 WebBase에서 Customer1로 전파되지 않습니다! 또한 프로젝트 대 삭제에서 삭제와 같은 것을 볼 수 있습니다 (영구 삭제에 대한 프롬프트가 표시됨).

두 번째 생각은 WebBase 용 nuget 패키지를 만드는 것입니다. 패키지로 설치하는 것보다이 방법을 사용하면 버전 관리가 가능하며 모든 작은 변경 사항으로 모든 프로젝트를 업데이트 할 필요가 없습니다. 그것은 각 프로젝트가 완전히 고립 된 채로 유지 될 것입니다. 아래쪽에서는 변경 사항을 전역으로 전파하기 위해 개별 프로젝트를 개별적으로 업데이트해야합니다. 당신은 nuget의 nuspec 파일과 파일 등을 포함시키는 법을 배워야 할 것입니다. 그렇게 나쁘지는 않습니다. 단지 XML 일뿐입니다. 그러나 패키지를 설치 / 업데이트 할 때 포함시킬 파일을 지정할 수 있습니다.

세 번째는 소스 컨트롤, 나는 자식과 함께 별도의 프로젝트 (심지어 외부 저장소)를 포함 할 수있는 하위 모듈을 사용할 수 있습니다. 옵션이 될 수도 있고 WebBase 분기를 만들고 WebBase를 설정 한 다음 각 고객의 웹 사이트로 분기 할 수도 있습니다. 그래서 Customer1이라는 브랜치를 만들고 커스텀 고객을 추가하기 시작합니다. WebBase로 다시 전환하여 Customer2라는 새로운 분기를 만듭니다 ... 당신은 경주를 벗어났습니다. WebBase로 다시 전환하고 전역을 변경 한 다음 이러한 변경 내용을 Customer1 및 Customer2 분기에 병합하십시오.

좋아, 나는 그것을 인정할 것이다. 아마도 나는 세 번째 옵션을 택할 것이다. 그것은 당신에게 작은 단점이있는 많은 이점을줍니다. 그것은 심지어 당신에게 역사를 제공합니다! 현재 소스 컨트롤을 사용하고 있지 않다면 ...해야합니다! git을 컴퓨터에 설치하고 로컬에서 코드를 검사 할 수 있으며 외부 저장소에 대해 걱정할 필요가 없습니다 (비록 내가 DR을 제공 할 것을 권장하지만).

어느 쪽이든, 사용할 수있는 옵션이 있습니다. 그러나 구성 가능한 파일이 포함 된 단일 프로젝트와 같은 것은 없습니다.

행운을 빕니다!


필요한 것은 고객에 따라 사이트의 다른 부분을 활성화 할 수있는 수퍼 관리자 섹션입니다.


이 질문에 대한 답은 약간의 혁신이 필요합니다. 그래서 내 해결책 좀 봐 :

모델컨트롤러 파일을 다루는 클래스의 핵심 프로젝트 구조를 설정하고 다음을 공유 할 수 있는 기존 항목 추가 링크 라는 기술로 사용 하십시오 .

  • 앱 로직은 두 앱 모두에 공통이지만 휴대 가능하지는 않습니다.
  • 플랫폼 의존성이없는 사용자 컨트롤

불행히도 면도기 에는 지원되지 않습니다. 따라서 공유보기를 복사하는 가장 쉬운 방법은 유명한 웹 사이트 _Layout.cshtml 파일과 같은 여러 개의 레이아웃 파일을 만드는 것 입니다. 또한 asp.net mvc Razor보기를 개별 dll로 컴파일하여 참조 (공유보기로 사용)처럼 사용할 수 있습니다.

Assets의 경우 기본 웹 응용 프로그램에서 모든 스타일 시트 (및 적절한 경우 일부 JavaScript)를 호스팅하고 각 웹 응용 프로그램에서 액세스 할 수 있습니다.

bin 폴더에는 프로젝트에 사용하기 위해 추가하는 핵심 MVC dll 파일과 빌드 후 생성되는 projectName.dll 파일이 있습니다. 참조 추가 도구를 사용하여 참조를 마우스 오른쪽 버튼으로 클릭하여 간단히 추가 / 제거 할 수 있습니다.





asp.net-mvc