2013-05-20 38 views
3

我已经和NuGet搏斗了几天,现在我正在转向StackOverflow,希望这里的某个人能够友好地指引我朝着正确的方向前进。是否有可能使NuGet.exe运行与Visual Studio断开连接?

我已经使用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. 如果它不过度对抗工具,我希望所有这些从Visual Studio中断开连接, .config文件和所有二进制文件转储到repo根目录中的单个Lib文件夹中。

任何指针将非常感激。

回答

0

下面,我怎么觉得你可以实现每个先决条件:

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

    nuget.exe安装“[Project folder]/packages”。配置” -source‘’-solutionDir‘’-OutputDirectory‘套餐’

  3. 这必要将项目1和2进行

+0

这听起来像只是想我需要......如果它来自JetBrains我希望它会工作,并易于使用。 – kellyb

0

有集成的NuGet到您的构建过程中的几个不同的解决方案取决于你需要多少集成,在我们的例子中,我们希望使用NuGet作为包管理器,并允许开发人员构建他们的解决方案,即使他们没有在他们的机器上安装NuGet,为了这个工作,我们启用了包恢复, NuGet二进制文件到您的解决方案文件夹并更新项目文件请注意,NuGet并不总是正确地更新项目文件。在我们的案例中,我们发现一些项目文件去吨更新,但其他人没有。要验证项目是否已更新,您需要以XML文件的形式打开项目文件。为了实现这个负载的解决方案,并右键点击相关项目并选择卸载项目。然后再次右键单击该项目并选择编辑[PROJECT_NAME]。在项目文件中,您应该看到

  • A 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框架)。

+0

我非常感谢详细的解释。这听起来与我正在走下的路径非常相似。我相信我可以最终实现这个目标,但是这比我想要的更复杂(多个配置文件和voodoo路径解析,依赖于Visual Studio等)。我宁愿让一些简单的东西 - 单个文件充当清单,并且有一件事情可以阅读并完成任务。我会检查JetBrains的东西......谢谢你们。 – kellyb

相关问题