2012-04-15 69 views
3

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

回答

4

安装完NuGet包后,您可以手动修改任何您想要的文件。只需在VS中编辑它们(或使用其他编辑器)。 NuGet软件包的唯一区别是,如果您在原始软件包文件和文件之间检测到更改时卸载/更新软件包,则不会删除您的已修改文件。这里会提到这是日志。

更新:

的NuGet已通过.transform and .pp files一个软件包安装期间修改项目文件的支持。但是这具有局限性,.transform文件将内容添加到配置文件(它们不能编辑),而.pp文件用于新的源代码文件。

您可以使用PowerShell中的EnvDte CodeModel(即install.ps1)修改现有源代码。虽然这有点复杂。

+0

这并不完全是我的意思。我的意思是你可以通过安装本身来更改文件吗?例如,我听说你可以在NuGet包中更改web.config。像,一些指令或脚本等?我想你可以通过脚本来改变任何文件,但是有没有一些典型的方法来做到这一点?所以当你安装一个软件包时,你会添加一些新文件,但是你的一些现有文件会被修改。例如,可能会更改default.aspx的内容。让我的意思呢? – vbullinger 2012-04-17 21:46:44

+1

现在明白了,我更新了上面的答案。简而言之,nuget已经支持.pp/.transform文件中的常见简单场景。 NuGet不支持修改现有代码,并通过PowerShell脚本完成。我会看看CodeModel,但我找不到一个简单的例子。 – 2012-04-18 18:20:36

+0

我看到了关于有文件的东西 - 我认为pp - 你会留下变量而不是命名空间等东西,它会从项目文件等中获取它,但是Entity Framework包如何添加web.config节点?它是否与脚本? – vbullinger 2012-04-19 23:15:55

2

如果您在NuGet包资源管理器中打开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 
} 
+0

谢谢!一个非常“你好,世界!” - 一个例子来开展这种任务。 – vbullinger 2014-03-24 14:18:42