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

时间:2012-04-15 00:09:58

标签: nuget nuget-package

是否可以更改通过NuGet包存在的文件的内容?这意味着,假设您创建了一个全新的MVC3网站。您想要安装将更新主页的NuGet包。也许更改欢迎消息,然后更改布局以包括您创建的一些新视图,并更新主控制器以包含返回新视图的方法。怎么会这样做?

2 个答案:

答案 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
}