NuGet命令行checkout packages.config

时间:2015-02-03 20:28:41

标签: visual-studio tfs nuget nuget-package

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

.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命令作为预构建事件(因为它已经具有我需要的行为)?

2 个答案:

答案 0 :(得分:2)

我最近自己一直在处理这个问题。遗憾的是,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

答案 1 :(得分:0)

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

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

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

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