是否可以更改通过NuGet包存在的文件的内容?这意味着,假设您创建了一个全新的MVC3网站。您想要安装将更新主页的NuGet包。也许更改欢迎消息,然后更改布局以包括您创建的一些新视图,并更新主控制器以包含返回新视图的方法。怎么会这样做?
答案 0 :(得分:5)
安装NuGet包后,您可以手动修改所需的任何文件。只需在VS(或其他编辑器)中编辑它们。关于NuGet包的唯一区别是,如果在原始包文件和文件之间检测到更改时卸载/更新包,则不会删除修改后的文件。会有人提到这是日志。
更新
NuGet支持在程序包安装期间通过.transform and .pp files修改项目文件。但这有局限性.transform文件向配置文件添加内容(它们无法编辑),而.pp文件用于新的源代码文件。
您可以使用PowerShell中的EnvDte CodeModel修改现有源代码(即install.ps1)。但它有点复杂。
答案 1 :(得分:2)
如果你在NuGet Package Explorer中打开JQuery NuGet包(或者只是解压缩包)并查看install.ps1和common.ps1,那么你可以看到一个例子,他们自动为_references.js添加一行JQuery,以便JQuery API将显示在IntelliSense中。
但是,是的,自动更新代码(特别是人们可以编辑的代码)是一个相当复杂的过程。 JQuery示例涉及使用正则表达式在更新之前查找现有引用,所有这一切都是将一行注释添加/更新到已知位置的特定文件(如果它不应该破坏构建出错了,因为它只是一个评论。)
我希望看到更多的例子,甚至是OP的请求等帮助函数库。
这是common.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
}