如何通过安装NuGet包更改现有文件?

4

通过NuGet包更改现有文件的内容是可能的吗?也就是说,假设你创建了一个全新的MVC3网站。你想安装一个NuGet包,它将更新主页。也许更改欢迎消息,然后更改布局以包含一些新的视图,并更新Home控制器来包含一个方法返回您的新视图。这应该如何完成?

2个回答

6

安装NuGet包后,您可以手动修改任何文件。只需在VS(或其他编辑器)中进行编辑即可。关于NuGet包的唯一区别是,如果检测到原始包文件和您的文件之间的更改,则卸载/更新包时不会删除修改后的文件。日志中将提到这一点。

更新:

NuGet支持通过.transform和.pp文件在软件包安装期间修改项目文件。但这有限制,.transform文件向配置文件添加内容(它们无法编辑),而.pp文件用于新源代码文件。

您可以在PowerShell中使用EnvDte CodeModel(即install.ps1)来修改现有的源代码。不过它稍微复杂一些。


1
这不是我想要的意思。我的意思是你能通过安装本身更改文件吗?例如,我听说你可以在NuGet包中更改web.config。像某些指令或脚本之类的东西?我想象你可以通过脚本更改任何文件,但是否有一些典型的方法来做到这一点?因此,当您安装软件包时,会添加一些新文件,但是您现有的某些文件会发生更改。例如,可能会更改default.aspx的内容。明白我的意思了吗? - vbullinger
1
现在我明白了,我已经更新了我的答案。简而言之,NuGet 在 .pp/.transform 文件中内置了对常见简单场景的支持。修改现有代码不受 NuGet 支持,需要通过 PowerShell 脚本完成。我会看一下 CodeModel,但我找不到一个简单的示例。 - Alexandre Dion
我看到一些关于文件的东西 - 我想是那些 pp 文件 - 在那里你可以留下变量而不是像命名空间之类的东西,它会从项目文件中获取,等等,但是例如 Entity Framework 包是如何添加 web.config 节点的呢?是通过脚本吗? - vbullinger
1
他们在包的内容中有一个名为 "Web.config.transform" 的文件。基本上,当 NuGet 安装包时,它会将 Web.config.transform 文件的内容与 web.config 合并(app.config.transform 与 app.config 合并)。 - Alexandre Dion

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
}

谢谢!这是一个非常“Hello, World!”的例子,可以开始进行此类任务。 - vbullinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接