通过NuGet包更改现有文件的内容是可能的吗?也就是说,假设你创建了一个全新的MVC3网站。你想安装一个NuGet包,它将更新主页。也许更改欢迎消息,然后更改布局以包含一些新的视图,并更新Home控制器来包含一个方法返回您的新视图。这应该如何完成?
通过NuGet包更改现有文件的内容是可能的吗?也就是说,假设你创建了一个全新的MVC3网站。你想安装一个NuGet包,它将更新主页。也许更改欢迎消息,然后更改布局以包含一些新的视图,并更新Home控制器来包含一个方法返回您的新视图。这应该如何完成?
安装NuGet包后,您可以手动修改任何文件。只需在VS(或其他编辑器)中进行编辑即可。关于NuGet包的唯一区别是,如果检测到原始包文件和您的文件之间的更改,则卸载/更新包时不会删除修改后的文件。日志中将提到这一点。
更新:
NuGet支持通过.transform和.pp文件在软件包安装期间修改项目文件。但这有限制,.transform文件向配置文件添加内容(它们无法编辑),而.pp文件用于新源代码文件。
您可以在PowerShell中使用EnvDte CodeModel(即install.ps1)来修改现有的源代码。不过它稍微复杂一些。
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
}