2012-04-15 4 views
3

NuGet 패키지를 통해 존재하는 파일의 내용을 변경할 수 있습니까? 의미, 당신이 새로운 MVC3 웹 사이트를 만든다고합시다. 홈 페이지를 업데이트 할 NuGet 패키지를 설치하려고합니다. 시작 메시지를 변경 한 다음 레이아웃을 변경하여 작성한 새로운 뷰를 포함하고 홈 컨트롤러를 업데이트하여 새 뷰를 반환하는 메소드를 포함하십시오. 어떻게이 일을 끝낼 수 있습니까?NuGet 패키지를 통해 기존 파일을 어떻게 변경합니까?

답변

4

NuGet 패키지를 설치 한 후 원하는 파일을 수동으로 수정할 수 있습니다. VS에서 (또는 다른 편집기로) 편집하십시오. NuGet 패키지와 관련된 유일한 차이점은 원래 패키지 파일과 파일간에 변경 사항이 감지 될 때 패키지를 제거/업데이트하면 수정 된 파일이 제거되지 않는다는 것입니다. 로그에 대한 언급이있을 것입니다.

업데이트 :

NuGet이 .transform and .pp files를 통해 패키지를 설치하는 동안 프로젝트 파일을 수정하기위한 지원이있다. 그러나 .ts 파일은 새로운 소스 코드 파일을위한 것이지만, 변환 파일은 설정 파일 (편집 할 수 없음)에 내용을 추가하는 데는 한계가 있습니다.

PowerShell에서 EnvDte CodeModel (예 : install.ps1)을 사용하여 기존 소스 코드를 수정할 수 있습니다. 그것은 조금 더 복잡하지만.

+0

확실히하지 무슨 뜻입니다 :

여기 common.ps1에서 하나 개의 함수입니다. 제 말은 설치 자체를 통해 파일을 변경할 수 있습니까? 예를 들어, NuGet 패키지 내의 web.config를 변경할 수 있다고 들었습니다. 일부 지시문이나 스크립트 등? 나는 당신이 어떤 파일을 스크립트를 통해 바꿀 수 있다고 상상하지만, 그것을 할 수있는 전형적인 방법이 있습니까? 따라서 패키지를 설치하면 몇 가지 새로운 파일이 추가되지만 기존 파일 중 일부는 변경됩니다. 예를 들어, default.aspx의 내용을 변경할 수 있습니다. 아직 내 의미를 얻으려고? – vbullinger

+1

지금 받으 셨습니다, 위의 답변을 업데이트했습니다. 짧은 nuget에서는 .pp/.transform 파일의 일반적인 간단한 시나리오를 지원하기 위해 구운 있습니다. 기존 코드를 수정하는 것은 NuGet에서 지원하지 않으며 powershell 스크립트를 통해 수행됩니다. CodeModel을 살펴 보았지만 간단한 예제를 찾을 수 없었습니다. –

+0

파일을 가지고있는 것에 대해 봤어 .PP로 생각해. 네임 스페이스 같은 것 대신 변수를 남기고 프로젝트 파일에서 가져 오는 것이지.하지만 어떻게 Entity Framework 패키지를 추가 할까? web.config 노드? 그것은 대본을 가지고 있습니까? – vbullinger

2

NuGet Package Explorer에서 JQuery NuGet 패키지를 열고 (또는 패키지의 압축을 풀면) install.ps1과 common.ps1을 보면 _references.js에 자동으로 행을 추가하는 예제를 볼 수 있습니다 JQuery의 경우 JQuery API가 IntelliSense에 표시됩니다.

그래, 자동으로 코드 (특히 사람들이 편집 할 수있는 코드)를 업데이트하는 것은 상당히 복잡한 프로세스입니다. JQuery 예제는 정규 표현식을 사용하여 업데이트하기 전에 기존 참조를 찾지 만 알려진 모든 특정 파일에 한 줄 주석을 추가/업데이트합니다. 그것이 단지 코멘트 일 뿐이므로 잘못된 것입니다.)

더 많은 예제와 OP 요청과 같은 도우미 함수 라이브러리를보고 싶습니다.

function AddOrUpdate-Reference($scriptsFolderProjectItem, $fileNamePattern, $newFileName) { 
    try { 
     $referencesFileProjectItem = $scriptsFolderProjectItem.ProjectItems.Item("_references.js") 
    } 
    catch { 
     # _references.js file not found 
     return 
    } 

    if ($referencesFileProjectItem -eq $null) { 
     # _references.js file not found 
     return 
    } 

    $referencesFilePath = $referencesFileProjectItem.FileNames(1) 
    $referencesTempFilePath = Join-Path $env:TEMP "_references.tmp.js" 

    if ((Select-String $referencesFilePath -pattern $fileNamePattern).Length -eq 0) { 
     # File has no existing matching reference line 
     # Add the full reference line to the beginning of the file 
     "/// <reference path=""$newFileName"" />" | Add-Content $referencesTempFilePath -Encoding UTF8 
     Get-Content $referencesFilePath | Add-Content $referencesTempFilePath 
    } 
    else { 
     # Loop through file and replace old file name with new file name 
     Get-Content $referencesFilePath | ForEach-Object { $_ -replace $fileNamePattern, $newFileName } > $referencesTempFilePath 
    } 

    # Copy over the new _references.js file 
    Copy-Item $referencesTempFilePath $referencesFilePath -Force 
    Remove-Item $referencesTempFilePath -Force 
} 
+0

감사합니다! 이런 종류의 작업을 진행하는 "안녕하세요, 세계!"- 예입니다. – vbullinger

관련 문제