在我们的产品中,我们有一些项目。几乎每一个都依赖于单一的,称为"核心"。我们将每个项目分配为分离的nuget包。对于部署我们的其他团队/产品nuget工作很好,在我们当地的工作中真的很痛苦。
每次"核心"项目被更改,我们需要重建它,构建nuget,在一些存储库中发布它,然后在其他项目中进行恢复。 这需要时间。 有时我们需要在几次迭代中对核心进行更改。我们需要一遍又一遍地制作构建发布nuget-update nuget圈子
到目前为止,我们发现的最佳解决方案是在本地工作期间将nuget引用切换为项目引用,并在我们想要发布它时将其切换回nuget。
但我们不确定它是否是最佳方式。
那么,在不加强工作的情况下,在两个本地项目中处理块金引用的最佳方法是什么?
谢谢
答案 0 :(得分:3)
在不加强工作的情况下,在两个本地项目中处理nuget引用的最佳方法是什么?
NuGet作为Microsoft开发平台的包管理器有许多优点,但这并不意味着它没有缺陷。正如您遇到的那样,如果经常修改引用的项目,我们必须重建它,构建nuget,为每次修改发布它。这将带来许多无聊的工作。要解决这个缺点,Project-to-project引用应该是更好的方法。
项目到项目引用的优点是它在构建系统中的项目之间创建依赖关系。如果自上次构建引用项目以来已更改,则将构建依赖项目。文件引用不会创建构建依赖项,因此可以在不构建依赖项目的情况下构建引用项目。
所以你所做的是最好的方式。当经常修改引用的项目时,应该建议项目到项目的引用,当将参考项目共享给其他人或发布它时,nuget引用更合适。
答案 1 :(得分:1)
我过去所做的就是编写一个小脚本,用你刚刚编译的二进制文件覆盖你的Nuget二进制文件。
这样,每次更改Nuget包中的单个字符时,都可以解决打包,分发和恢复包的负担
...而不更改消费项目中的项目引用
工作流程:
我已经将一个Powershell脚本组合在一起 - 我不时自己使用它:
$ErrorActionPreference = 'Stop'
$SourceBasePath = 'C:\Projects\MyNugetPackage\Main'
$TargetBasePath = 'C:\Projects\MyNugetConsumer\Main'
$Configuration = 'bin\debug'
#0 = Source DLL
#1 = Source location in $SourceBasePath
$maps = @(
,@('SomeBinary.dll', 'Foo\Bar')
,@('AnotherBinary.dll', 'Bar\Baz')
)
foreach($map in $maps) {
#Find all packages that contains a copy of the source binary
$targets = Get-ChildItem "$TargetBasePath\$($map[1].Split('\')[0])\packages" -Filter $map[0] -Recurse
foreach($target in $targets) {
$sourcePathDll = "$SourceBasePath\$($map[1])\$Configuration\$($map[0])"
$targetPathDll = Join-Path $target.Directory.FullName $map[0]
$sourcePathPdb = $sourcePathDll.Replace('.dll', '.pdb')
$targetPathPdb = $targetPathDll.Replace('.dll', '.pdb')
Write-Host ''
Write-Host $sourcePathDll
Write-Host $targetPathDll
Write-Host $sourcePathPdb
Write-Host $targetPathPdb
if (!(Test-Path $sourcePathDll)) {
throw "Source not found: ", $sourcePathDll
}
if (!(Test-Path $targetPathDll)) {
throw "Target not found: ", $targetPathDll
}
copy $sourcePathDll $targetPathDll
copy $sourcePathPdb $targetPathPdb
}
}
你可能会遇到使用Visual Studio锁定DLL的问题 - 我猜这里没有免费的午餐:o)
答案 2 :(得分:0)
从NuGet 3.3开始,您可以使用本地文件夹,它可以托管分层NuGet源。为“本地服务器”创建一个文件夹然后去那里运行“nuget init source dest”,其中“source”是一个文件夹,我已经拥有* .nupkg“文件。 由于NuGet Server从C:\ LocalNuGet中提取,您可以获取一个充满NuPkg文件的文件夹(平面)并将其导入:
nuget init c:\source c:\localnuget
详细信息请查看这些
https://github.com/NuGet/NuGetGallery/wiki/Hosting-the-NuGet-Gallery-Locally-in-IIS
http://haacked.com/archive/2010/10/21/hosting-your-own-local-and-remote-nupack-feeds.aspx/
答案 3 :(得分:0)
在Node社区中,使用符号链接可以长期解决本地包问题(请参见this blog post和npm link命令)。
工作原理:分布式软件包的目录“符号链接”到软件包源目录。这样,程序包使用者将透明地重定向到程序包源项目,并且程序包源中的更改会自动反映在使用者方。
由于某些原因,NuGet仍然没有链接功能。有一个功能请求https://github.com/NuGet/Home/issues/1821,表明他们没有计划添加它。
与此同时,我创建了一个工具,该工具的作用与 npm链接类似,适用于NuGet软件包,但您可以尝试一下:https://www.nuget.org/packages/NuLink