【问题标题】:Is it possible to get NuGet.exe running disconnected from Visual Studio?是否可以让 NuGet.exe 与 Visual Studio 断开连接?
【发布时间】:2013-05-21 10:08:08
【问题描述】:

我已经与 NuGet 搏斗了几天,我正沮丧地转向 StackOverflow - 希望这里的人能善意地为我指明正确的方向。

我曾多次将 NuGet 用于简单的单人宠物项目,但这是我第一次将它用于我真正关心并希望进行完全连续构建等的事情。我正在尝试创建一个简单的 NAnt 构建脚本来获取 Git 的源代码,确保已关闭外部依赖项,编译并运行测试 - vanilla CI。

我最初尝试让解决方案恢复工作,但它没有工作,或者我没有工作。 Visual Studio 不在构建服务器上,也不会安装在那里 - 这不是一个选项。顺便说一句,我无法仅与两个开发人员一起使用解决方案恢复工作(一个试图降低源代码并干净地构建)。我假设这是因为必须在任何地方打开“允许解决方案还原”(默认情况下不是)。在深入了解它之前,我曾尝试过这种方法 - 坦率地说,让我的包管理器与 IDE 如此紧密地耦合让我感到不舒服,并希望我能以另一种方式做到这一点。我习惯使用的包管理器是简单的命令行工具——CI 构建脚本在构建时调用它,开发人员按需执行。我花了两个小时试图在 NuGet 源代码的最后 30 分钟内完成这项工作。我觉得我正在与该工具作斗争,需要重新启动。

有没有人有任何在多开发人员 + CI 场景中使用 NuGet 的最佳示例?这就是我想要的:

  1. 任何和所有开发人员都可以获取源代码并在 3 或 更少的点击次数(最好是 1 次)。如果二进制文件在本地不存在,则将通过 JIT 获取。如果它们在那里,它们将在必要时进行更新等。理想情况下,这甚至不需要安装 NuGet(即 NuGet.exe 需要在我的存储库中)。
  2. 通过 Jenkins、TeamCity 等 CI 服务器执行 #1(最好使用相同的脚本)
  3. 如果它没有过度使用该工具,我希望使用单个 packages.config 文件将所有这些与 Visual Studio 断开连接,并将所有二进制文件转储到存储库根目录中的单个 Lib 文件夹中。

任何指针将不胜感激。

【问题讨论】:

    标签: continuous-integration build-automation nuget


    【解决方案1】:

    下面,我认为你可以如何实现你的每一个要求:

    1. 您需要在您的解决方案中“启用 NuGet 包还原”:http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages
    2. 正如@alexander-doroshenko 为 TeamCity 提到的,您可以使用 Nuget 安装程序:http://confluence.jetbrains.com/display/TCD7/NuGet+Installer,但如果您想在 Jenkins 中运行脚本,请为每个项目尝试这个(在 TC 也可以,作为命令行步骤):

      nuget.exe install "[项目文件夹]/packages.config" -source "" -solutionDir "" -OutputDirectory "packages"

    3. 此要求将由第 1 项和第 2 项完成。

    【讨论】:

    • 这听起来只是我需要的......如果它来自 JetBrains,我希望它会运行良好并且易于使用。
    【解决方案2】:

    TeamCity 有一个构建步骤,称为“NuGet Installer”,它从 .sln 文件中获取所需的包并下载到本地。它不需要运行 Visual Studio。

    在此处了解更多信息:http://confluence.jetbrains.com/display/TCD7/NuGet+Installer

    【讨论】:

      【解决方案3】:

      根据您需要的集成程度,有多种不同的解决方案可将 NuGet 集成到您的构建过程中。在我们的案例中,我们希望使用 NuGet 作为包管理器,并允许开发人员构建他们的解决方案,即使他们没有在他们的机器上安装 NuGet。为此,我们启用了包还原,它将 NuGet 二进制文件添加到您的解决方案文件夹并更新项目文件。请注意,NuGet 并不总是正确更新项目文件。在我们的例子中,我们发现一些项目文件得到了更新,而其他的却没有。要验证项目是否已更新,您需要将项目文件作为 XML 文件打开。要实现此加载解决方案并右键单击有问题的项目并选择卸载项目。然后再次右键单击该项目并选择编辑 [PROJECT_NAME]。在项目文件中你应该看到

      • 第一个属性组中的RestorePackages 属性。此属性的值应为 true
      • 项目文件末尾的import 语句。此导入语句应指向 NuGet 二进制文件随附的“NuGet.targets 文件”。

      以下是我们的一个项目文件的示例(经过大量编辑)

      <?xml version="1.0" encoding="utf-8"?>
      <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
          <SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir>
          <ProjectGuid>{8B467882-7574-41B2-B3A8-2F34DA84BE82}</ProjectGuid>
          <OutputType>Library</OutputType>
          <RootNamespace>MyCompany.MyNamespace</RootNamespace>
          <AssemblyName>MyCompany.MyNamespace</AssemblyName>
      
          <!-- Allow NuGet to restore the packages if they are missing -->
          <RestorePackages>true</RestorePackages>
        </PropertyGroup>
        <Import Project="$(SolutionDir)\BaseConfiguration.targets" />
        <ItemGroup>
          <Reference Include="System" />
          <Reference Include="System.Core" />
        </ItemGroup>
        <ItemGroup>
          <Compile Include="MyClass.cs" />
          <!--
              .... MANY MORE FILES HERE
          -->
        </ItemGroup>
      
        <!-- Import the Nuget.targets file which integrates NuGet in the build process -->
        <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
        <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
             Other similar extension points exist, see Microsoft.Common.targets.
        <Target Name="BeforeBuild">
        </Target>
        <Target Name="AfterBuild">
        </Target>
        -->
      </Project>
      

      您需要采取的下一步是提供解决方案级别的 NuGet 配置文件,您将在其中指出需要“安装”包的位置以及 package repository 的 URL 是什么。在我们的例子中,解决方案目录结构如下所示:

      (D) root
          (D) build
          (D) packages
          (D) source
              (D) .nuget
                  NuGet.config
                  NuGet.exe
                  NuGet.targets
              (D) MyCoolProject
                  MyCoolProject.csproj
              MyCoolProject.sln
          (D) templates
          NuGet.Config
      

      其中(D) 表示一个目录。

      NuGet.config 文件包含以下配置设置。

      <?xml version="1.0" encoding="utf-8"?>
      <configuration>
        <packageRestore>
          <add key="enabled" value="True" />
        </packageRestore>
        <config>
          <add key="repositorypath" value="packages" />
        </config>
        <packageSources>
          <add key="OurPackageServer" value="PACKAGE_SERVER_ADDRESS" />
        </packageSources>
        <activePackageSource>
          <add key="All" value="(Aggregate source)" />
        </activePackageSource>
      </configuration>
      

      此配置文件表示启用了包还原,存储库路径(放置包的位置)是包目录以及哪些包源处于活动状态。

      通过将 NuGet.config 文件放在根目录中,我们可以在 NuGet 中使用 hierarchical configuration 选项。这允许单独的解决方案覆盖计算机特定的配置。另一个好处是这样我们就不需要在构建服务器上安装 NuGet(因为可执行文件和配置都在存储库中)。

      通过此设置,开发人员可以从 Visual Studio 构建解决方案。即使没有安装 NuGet,构建也应该在开发人员机器上正常工作。但是请注意,如果没有在 Visual Studio 中安装 NuGet,他们将无法将包添加到项目中。 在构建服务器上,您可以简单地使用 MsBuild 构建解决方案,该解决方案将自动从您的包存储库下载包。不需要为此在构建机器上安装 Visual Studio(只需您选择的 .NET 框架)。

      【讨论】:

      • 我非常感谢详细的解释。这听起来与我要走的路非常相似。我确信我最终可以让它工作,但这比我想要的要复杂得多(多个配置文件和巫毒路径解析,对 Visual Studio 的依赖等)。我宁愿有一些简单的东西——单个文件作为清单,一件事读进去并完成工作。我会检查 JetBrains 的东西...谢谢大家。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多