문제

어떤 이유로 든, 컴파일 된 어셈블리, 구성 파일 및 기타 다양한 파일을 베타 테스터를 위해 네트워크 공유로 Xcopy에 배치 파일을 생성하는 스크립트가 있습니다. 설치 프로그램이 있지만 일부는 설치 프로그램을 실행하는 데 필요한 권한이 없거나 Citrix를 통해 실행 중입니다.

Xcopy와 Citrix의 언급으로 책상 전체에 구토 한 경우 일찍 집으로 돌아가는 변명으로 사용하십시오. 천만에요.

코드는 현재 다음과 같은 수백 개의 라인을 가지고 있습니다.

CreateScripts(basePath, "Client", outputDir, FileType.EXE | FileType.DLL | FileType.XML | FileType.CONFIG);

예전에는 20 개의 int 매개 변수 (파일 당 하나)가 해당 파일 유형을 출력 디렉토리에 복사할지 여부를 나타내지 않음을 나타냅니다.

이 수백 개의 라인은 수천 개의 Xcopy 라인이있는 업로드/다운로드 배치 파일을 만듭니다. 설정 프로젝트에서 "클라이언트의 기본 출력"및 "클라이언트의 콘텐츠 파일"과 같은 내용을 참조 할 수 있습니다. 나는 비 설정 프로젝트에서 프로그래밍 방식으로 그렇게 할 수 있기를 원하지만 나는 손실에 처해 있습니다.

분명히 MS는 API를 사용하거나 .csproj 파일을 구문 분석하여 수행합니다. 이 작업을 어떻게할까요? 나는 단지 설정 카테고리에 대한 파일 목록을 얻는 방법을 찾고 있습니다.

  • 기본 출력
  • 현지화 된 자원
  • 컨텐츠 파일
  • 문서화 파일

편집하다: Hath가 제안한 것과 같은 설정 프로젝트가 있으며, 내가 찾고있는 것과 반쯤 있습니다. 완벽한 솔루션이되는 것을 유지하는 유일한 문제는 여러 프로젝트가 자체 폴더에있는 동일한 어셈블리에 의존하고 설정은 파일을 한 번만 복사한다는 것입니다.

예시:

프로젝트 관리자, 클라이언트 및 서버는 모두 ExceptionHandler.dll에 의존하며 관리자 및 클라이언트는 모두 UTIL.DLL에 의존하지만 서버는 그렇지 않습니다. 이것이 제가 찾고있는 것입니다.

  • 관리자
    • admin.exe
    • admin.exe.config
    • ExceptionHandler.dll
    • util.dll
  • 고객
    • 클라이언트.exe
    • client.exe.config
    • ExceptionHandler.dll
    • util.dll
  • 섬기는 사람
    • Server.exe
    • Server.exe.config
    • ExceptionHandler.dll

참조 된 어셈블리는 모두 동일하기 때문에 내가 얻는 것은 다음과 같습니다.

  • 관리자
    • admin.exe
    • admin.exe.config
    • ExceptionHandler.dll
    • util.dll
  • 고객
    • 클라이언트.exe
    • client.exe.config
  • 섬기는 사람
    • Server.exe
    • Server.exe.config

클라이언트 나 서버가 기대하는 두 DLL 중 하나를 찾을 수 없을 때 filenotFoundException이 발생합니다.

다른 프로젝트의 출력의 다른 곳에서 복제되어 있어도 항상 출력을 복사하기 위해 누락 된 설정 속성이 있습니까?

다시 편집하십시오: 모든 참조 된 DLL은 "로컬 복사"로 설정되었으며 항상 그렇습니다. 나는 괜찮은 기사를 찾았습니다 NANT 및 XSLT를 사용하여 파일 목록을 가져옵니다., Neouser99가 제안한대로 가능한 솔루션 일 수 있습니다.

허용 된 솔루션: 나는 내가 시작한 곳으로 돌아온다. 모든 .exe 및 .dll 출력은 설정 프로젝트에서 느슨하게 포장 된 "Bin"디렉토리에 넣습니다. 다른 신청 별 폴더에는 해당 디렉토리의 실행 파일로 단축키가 포함되어 있습니다.

차이점은 이제 설치 프로그램에 사용자 정의 조치를 추가하여 반사를 사용하고 각 실행 파일 출력에 대한 종속성을 열거하고 .exe 및 .dll 파일을 별도의 디렉토리로 복사 할 것입니다. 방금 일부 설정 라이브러리를 통해 어떤 파일이 포함될 파일을 프로그래밍적으로 감지하는 방법이 있다고 가정했기 때문에 약간의 고통이 있습니다.

도움이 되었습니까?

해결책

다른 설정 프로젝트를 사용하고 '패키지 파일'설정을 느슨한 압축 파일 (설정 프로젝트-> 속성)으로 설정하지 않겠습니까? 그런 다음 폴더를 공유하십시오. 또는 뭔가.

편집하다:

알다시피, 당신은 당신의 출력을위한 3 개의 폴더가 있습니다. 그러나 설정 프로젝트는 ExceptionHandler.dll 및 util.dll 만 한 번만 감지하므로 첫 번째 폴더를 선택하여 거기에 넣습니다.

각 프로젝트에 대한 설정 프로젝트를 수행 할 수 있습니다.

'파일 추가'또는 '어셈블리 추가'또는 '어셈블리 추가'또는 '프로젝트 출력 추가'로 파일을 추가하여 어셈블리가 누락 된 프로젝트에 DLL을 수동으로 추가 할 수 있습니다. 그래도 의심의 여지가 있습니다).

또는 그 모든 것을 하나의 출력 디렉토리에 버립니다 ...

다른 팁

빌드 도구로 설계되었지만 찾을 수 있습니다. 넌트 당신이 말하는 것에 매우 유용합니다. 정의 할 수있는 작업 (빌드, 복사, 이동, 삭제 등)을 통해 매우 세밀한 파일 조회를 일반적인 전체 폴더까지 허용합니다. Nant를 빌드 프로세스에 통합한다면, 그것이 더 많은 방법으로 도움이된다는 것을 알 수 있다고 생각합니다.

과거에 저를 위해 일한 또 다른 접근법은 각 관리자, 서버 및 클라이언트 프로젝트에 대한 참조로 공유 리소스 (어셈블리, DLL 또는 프로젝트)를 추가하는 것입니다. 그런 다음 각 프로젝트에서 참조 된 항목의 속성 패널을 열고 "로컬 복사"를 true로 설정하십시오.

이제 프로젝트를 구축하면 각각의 어셈블리 인스턴스가 출력 폴더에 복사됩니다.

또한 이러한 방식으로 추가 된 공유 구성 요소가 설정 패키지의 각 출력 폴더에 복제되어야합니다.

완전히 다른 접근법은 네트워크 공유에서 상징적 링크로 설정하는 것입니다. 상징적 링크는 기본적으로 파일 시스템이 바로 가루라는 사실을 숨기는 단축 장치이므로 다른 모든 응용 프로그램은 실제로 파일이 복사되었다고 믿습니다 (http://en.wikipedia.org/wiki/ntfs_symbolic_link).

이 접근법의 장점 중 하나는 파일이 변경 될 때 그리고 프로젝트를 구축 할 때뿐만 아니라 파일이 즉시 업데이트된다는 것입니다. 따라서 예를 들어 텍스트 편집기로 구성 파일 중 하나를 저장하면 업데이트가 즉시 적용됩니다.

다음 MSBuild 스크립트 부품은 SLN 파일을 빌드 할 수 있으며 (.CSPROJ로 교체 할 수 있음) 빌드 된 모든 프로젝트 (DLLS, EXES)의 목록을보고합니다.

 <MSBuild Projects="MySolution.sln" Targets="Clean; Rebuild" Properties="Configuration=$(BuildMode);">
    <Output TaskParameter="TargetOutputs"
                ItemName="AssembliesBuilt" />
    </MSBuild>

이제 이것은 실제로 문제를 해결하지 못하지만 구축 된 모든 것의 목록을 얻을 수 있습니다. 당신은 또한 copylocal을 가지고 있으므로 아마도 어셈블리 빌드를 가져 와서 모든 dll 및 .config 파일을 복사 할 수 있습니다.

예시:

Assembliesbuild = c : myproj something1 build.dll

당신은 c : myproj something1 로 이동하여 모든 *.dll 및 *.config 파일을 검색하고 포함합니다. 설치 한 경우 MSBuild 또는 PowerShell을 사용 하여이 작업을 쉽게 수행 할 수 있습니다. MSBuild에서 Xcopy 스크립트를 출력하려면 MSBuild Contrib Projct가 설치되어야한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top