首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以将NuGet.exe从Visual断开连接?

是否可以将NuGet.exe从Visual断开连接?
EN

Stack Overflow用户
提问于 2013-05-20 16:27:33
回答 3查看 2K关注 0票数 3

我已经和NuGet搏斗了几天了,我正沮丧地求助于StackOverflow --希望这里的人能给我指明正确的方向。

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

最初,我试图使解决方案恢复工作,但它只是没有工作,或者我没有它的工作方式。Visual不在构建服务器上,也不会安装在那里--这不是一个选项。顺便说一句,我无法让解决方案恢复只与两个开发人员一起工作(其中一个开发人员试图恢复源代码并干净地构建)。我认为这是因为“允许解决方案恢复”必须在任何地方打开(而不是默认的)。在深入了解之前,我就对这种方法进行了深入研究--坦白地说,让我的包管理器与IDE紧密地结合在一起会让我感到不舒服,并且希望我能用另一种方式来实现它。我习惯使用的包管理器是简单的命令行工具-- CI构建脚本在构建时调用它,开发人员按需执行。在过去的两个小时里,我一直在用NuGet源代码中的最后30分钟来实现这个目标。我觉得我在对抗这个工具,需要重新启动。

有没有人在多开发者+ CI场景中有最好使用NuGet的例子?这就是我想要的:

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

任何指点都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-21 01:18:51

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

  1. 您需要在解决方案中“启用NuGet包恢复”:http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages
  2. 正如@alexander在TeamCity中提到的那样,您可以使用Nuget:http://confluence.jetbrains.com/display/TCD7/NuGet+Installer,但是如果您想要在Jenkins中运行一个脚本,可以对每个项目进行以下操作(也可以在TC作为命令行步骤): 安装“nuget.exe文件夹/Packages.config”-source“-solutionDir "”-OutputDirectory“软件包
  3. 这项要求将在第1和第2项下完成。
票数 0
EN

Stack Overflow用户

发布于 2013-05-20 18:36:52

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

在这里阅读更多相关信息:http://confluence.jetbrains.com/display/TCD7/NuGet+Installer

票数 0
EN

Stack Overflow用户

发布于 2013-05-21 02:08:08

有几种不同的解决方案用于将NuGet集成到您的构建过程中,具体取决于您需要的集成量。在我们的例子中,我们希望使用NuGet作为包管理器,并且允许开发人员构建他们的解决方案,即使他们没有在他们的机器上安装NuGet。为此,我们启用了包还原,它将NuGet二进制文件添加到解决方案文件夹并更新项目文件。注意,NuGet并不总是正确地更新项目文件。在我们的例子中,我们发现一些项目文件被更新了,而另一些没有被更新。要验证项目是否被更新了,您需要以XML文件的形式打开项目文件。要实现此目的,请加载解决方案,右键单击所讨论的项目并选择“卸载项目”。然后再次右键单击该项目,并选择“编辑PROJECT_NAME”。在项目文件中,您应该看到

  • 第一个propertygroup中的RestorePackages属性。此属性应具有值true
  • 项目文件末尾的import语句。这个导入语句应该指向与NuGet二进制文件一起的‘NuGet文件’。

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

代码语言:javascript
复制
<?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配置文件,您将在该文件中指示包需要‘安装’的位置以及包存储库的URL。在本例中,解决方案目录结构如下所示:

代码语言:javascript
复制
(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文件包含以下配置设置。

代码语言:javascript
复制
<?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中使用层次结构选项。这允许各个解决方案覆盖计算机特定的配置。另一个好处是我们不需要在构建服务器上安装NuGet (因为可执行文件和配置都在存储库中)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16653978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档