【问题标题】:NuGet command line checkout packages.configNuGet 命令行签出 packages.config
【发布时间】:2015-04-03 04:39:28
【问题描述】:

我的项目目前正在引用一些代表夜间构建的预发布包。我想确保我始终针对最新版本进行构建。我在我的项目中添加了一个预构建事件:

.nuget\nuget.exe update -safe -noninteractive -prerelease -source "My-Package-Repo/nuget" $(SolutionPath)

这会在构建期间生成以下输出:

Scanning for projects...
Found 1 projects with a packages.config file. (MyProject)
Looking for installed packages in '..\..\packages'.
Updating 'MyProject'...
EXEC : warning : Access to the path 'C:\workspace\mainline\MyProject\packages.config' is denied.

问题是 packages.config 文件仍然被源代码控制锁定,因此 NuGet 无法更新包版本。有趣的是,如果我从包管理器控制台运行update-package,它会自动检查 packages.config 文件并更新解决方案的所有包。

有没有办法让 NuGet 在使用命令行界面时自动检查 packages.config 文件?或者,是否可以在 PM 控制台中运行 update-package 命令作为预构建事件(因为它已经具有我需要的行为)?

【问题讨论】:

    标签: visual-studio tfs nuget nuget-package


    【解决方案1】:

    我自己最近一直在处理这个问题。不幸的是,nuget.exe 更新不会自行检出文件,并且包管理器控制台仅在 Visual Studio 中运行(它显然与 Visual Studio 环境挂钩以执行枚举项目等操作)。

    如果你愿意使用powershell,我建议如下:

    1.制作一个 Powershell 脚本来处理从您的解决方案中解析项目文件

    $sln = $args[0]
    $projects = ((ss '= (\S+.csproj)' $sln -All) `
        | % {$_.Matches.Groups[1].Value -replace "\\\\","\"})
    $configFiles = $projects -replace '(?<=\\)[^\\]+?\.csproj', 'packages.config'
    'tf checkout ' + ($projects -join ' ') | iex
    'tf checkout ' + ($configFiles -join ' ') | iex
    ('.nuget\nuget.exe update -safe -noninteractive -prerelease -source "My-Package-Repo/nuget"' `
        + $sln) | iex
    

    2。将该 powershell 脚本与您的解决方案放在同一文件夹中

    3.从您的预构建事件中调用该 powershell 脚本

    powershell -file $(SolutionDir)nuget-update.ps1 "$(SolutionPath)"
    

    要撤消对项目和配置文件未更改的任何更改,请在上述操作之后运行tfpt uu noget

    【讨论】:

    • 这是一个过于复杂且不必要的解决方案。切换到本地工作区,您不会在文件上看到只读标志:visualstudiomagazine.com/articles/2012/11/02/…
    • @MrHinsh,谢谢你 - 我没有考虑过本地工作空间。我的团队在那篇文章中遇到了警告(“如果您的工作区包含超过 100,000 个文件,您应该考虑改用服务器工作区”),所以我自己使用了上述方法,但本地工作区可能适用于其他人。
    • 本地工作空间会很棒,但我们仍在使用 TFS 2010。目前这不是一个选项。我正在考虑编写一个解决方案的脚本,但希望我可能只是错过了命令行开关或其他东西。感谢您的 PS。
    【解决方案2】:

    您正在使用服务器工作区(为服务器模式配置的工作区)。您应该更改为本地工作区。

    在本地工作区中的文件未标记为只读,可以在 Visual Studio 之外进行编辑。

    最新的 Nuget - 如果您在 Nuget 项目文件中编辑包引用,则只需删除版本号即可。然后,Nuget 将始终在构建时加载最新版本。

    编辑 package.config - 您应该从源代码管理中排除 /packages/ 文件夹。在最新版本的 Nuget 包管理器中,这不是必需的。

    【讨论】:

    • 即使包目录被排除,位于 csproj 文件旁边的单个 packages.config 文件 也被签入,并且 nuget.exe 更新需要将这些文件编辑为更新软件包的版本号。另外,您所说的“最新版本”是什么版本?从 2.8.5 开始,我无法让它定义没有 version 属性的 packages.config,因此它不会获得最新的。
    • 糟糕...这可能是 Nuget 3 的一个功能...忽略那行...当我到达 PC 时我会删除...
    • 哦,看起来 nuget3 对于自动化构建会好得多。感谢您指出这个方向!
    • 我不希望 nuget 获得最新的可用版本,我想要 specific 版本的最新 build。例如,我依赖于 AssemblyX v2.0.1(目前在开发和发布夜间版本)。同时,开发团队完成了 AssemblyX v3.0.0 并发布了一个稳定的包。在 semver 之后,v3.0.0 与我的应用程序不兼容,我不想自动对其进行更新(因此我的更新命令中的 -safe 开关)。我希望 versiion range syntax 在 packages.config 上工作。
    • 我来。你检查过 Nuget 3 是否支持这个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    相关资源
    最近更新 更多