跨多个项目和解决方案共享NuGet包

时间:2016-04-06 20:54:41

标签: visual-studio nuget nuget-package projects-and-solutions portable-class-library

当前首选的方法是将NuGet设置为在项目中的所有解决方案中都有一个公共包目录?还有一种方法可以将PCL包包含在不同项目的公共文件夹中(这样可以跨目标不同平台的项目共享包)。我之前看过类似的问题,但我找不到与最新版NuGet有关的明确答案。

2 个答案:

答案 0 :(得分:6)

如果在所有解决方案的共同祖先目录中包含nuget.config文件,那么当您使用Visual Studio打开任何解决方案时,它将使用此配置文件来配置NuGet。

nuget.config配置的一个问题是解决方案的nuget包文件夹的位置。

参考:https://docs.nuget.org/consume/nuget-config-file

示例nuget.config:请注意QString与nuget.config文件的位置有关。

repositoryPath

答案 1 :(得分:0)

如果有其他人遇到这个问题,我就是这样解决问题的方法: 约翰卡彭特引导我朝着正确的方向前进。我在Nuget的网站上找到了一些信息: https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore

为了实现这一目标,我编辑了Owen Johnson的Powershell迁移脚本 这是他的脚本的链接: https://github.com/owen2/AutomaticPackageRestoreMigrationScript

对我来说,脚本不够详尽,并没有纠正项目文件中的提示路径(这是一个问题)。 *注意如果您没有在某处或源代码管理中保存代码的副本,请确保不要运行此操作。如果这搞砸了您的项目,则无法保证。 这是我使用的脚本:

########################################
# Regex Patterns for Really Bad Things!
$listOfBadStuff = @(
    #sln regex
    "\s*(\.nuget\\NuGet\.(exe|targets)) = \1",
    #*proj regexes
    "\s*<Import Project=""(\$\(SolutionDir\))?(\d|\w|\s|\.|\\)*(\.nuget|package).*?/>",
    "\s*<Target Name=""(EnsureNuGetPackageBuildImports|EnsureBclBuildImported)""(.|\n)*?>(.|\n)*?</Target>",
    "\s*<RestorePackages>\w*</RestorePackages>",
    #HintPaths
    "\s*<HintPath>(\$\(SolutionDir\))?(\d|\w|\s|\.|\\)*package.*?</HintPath>"

)

#######################
# Delete NuGet.targets and package folders

ls -Recurse -include 'NuGet.exe','NuGet.targets','NuGet.config' |
  foreach { 
    remove-item $_ -recurse -force
    write-host deleted $_
}

#########################################################################################
# Fix Project and Solution Files to reverse damage done by "Enable NuGet Package Restore

ls -Recurse -include *.csproj, *.sln, *.fsproj, *.vbproj, *.wixproj, *.vcxproj |
  foreach {
    sp $_ IsReadOnly $false
    $content = cat $_.FullName | Out-String
    $origContent = $content
    foreach($badStuff in $listOfBadStuff){
        $content = $content -replace $badStuff, ""
    }
    if ($origContent -ne $content)
    {   
        $content | out-file -encoding "UTF8" $_.FullName
        write-host messed with $_.Name
    }           
}

我添加了一个删除提示路径的命令。运行脚本后,您可能会遇到一些Nuget错误,因为某些包需要一个提示路径。为了解决这些问题,您需要重新安装这些软件包。 Nuget网站上的以下链接向您展示了如何执行此操作: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html

所以我执行完整迁移的步骤: 1)在代码库的根级别运行Powershell脚本。 2)将NuGet.config文件添加到代码库的根目录(使用作为模板提供的John Carpenter) 3)重新安装任何需要有一个提示路径的包(应该修复你有的任何Nuget错误)。 4)现在,当您构建任何解决方案时,Nuget应将您的包放在中央包文件夹中。