nuget包在当地工作

时间:2017-03-21 13:22:11

标签: .net visual-studio nuget

在我们的产品中,我们有一些项目。几乎每一个都依赖于单一的,称为"核心"。我们将每个项目分配为分离的nuget包。对于部署我们的其他团队/产品nuget工作很好,在我们当地的工作中真的很痛苦。

每次"核心"项目被更改,我们需要重建它,构建nuget,在一些存储库中发布它,然后在其他项目中进行恢复。 这需要时间。 有时我们需要在几次迭代中对核心进行更改。我们需要一遍又一遍地制作构建发布nuget-update nuget圈子

到目前为止,我们发现的最佳解决方案是在本地工作期间将nuget引用切换为项目引用,并在我们想要发布它时将其切换回nuget。

但我们不确定它是否是最佳方式。

那么,在不加强工作的情况下,在两个本地项目中处理块金引用的最佳方法是什么?

谢谢

4 个答案:

答案 0 :(得分:3)

  

在不加强工作的情况下,在两个本地项目中处理nuget引用的最佳方法是什么?

NuGet作为Microsoft开发平台的包管理器有许多优点,但这并不意味着它没有缺陷。正如您遇到的那样,如果经常修改引用的项目,我们必须重建它,构建nuget,为每次修改发布它。这将带来许多无聊的工作。要解决这个缺点,Project-to-project引用应该是更好的方法。

项目到项目引用的优点是它在构建系统中的项目之间创建依赖关系。如果自上次构建引用项目以来已更改,则将构建依赖项目。文件引用不会创建构建依赖项,因此可以在不构建依赖项目的情况下构建引用项目。

所以你所做的是最好的方式。当经常修改引用的项目时,应该建议项目到项目的引用,当将参考项目共享给其他人或发布它时,nuget引用更合适。

答案 1 :(得分:1)

我过去所做的就是编写一个小脚本,用你刚刚编译的二进制文件覆盖你的Nuget二进制文件。

这样,每次更改Nuget包中的单个字符时,都可以解决打包,分发和恢复包的负担

...而不更改消费项目中的项目引用

工作流程:

  1. 代码和构建Nuget二进制文件
  2. 在使用Nuget包的项目的/ packages文件夹中运行脚本覆盖二进制文件
  3. 享受
  4. 我已经将一个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 postnpm link命令)。

工作原理:分布式软件包的目录“符号链接”到软件包源目录。这样,程序包使用者将透明地重定向到程序包源项目,并且程序包源中的更改会自动反映在使用者方。

由于某些原因,NuGet仍然没有链接功能。有一个功能请求https://github.com/NuGet/Home/issues/1821,表明他们没有计划添加它。

与此同时,我创建了一个工具,该工具的作用与 npm链接类似,适用于NuGet软件包,但您可以尝试一下:https://www.nuget.org/packages/NuLink