drz*_*aus 64 build-automation visual-studio nuget nuget-package
我想运行本地/内部NuGet存储库.我想我已经想出了如何"重用"现有的NuGet包,方法是将它们包含在使用NuGet的虚拟项目中,并扫描包文件以获取我的本地缓存.nupkg文件,但......
.nupkg从项目中创建nuget package(),自动包含所有 dll依赖项,而不仅仅是通过NuGet获取的依赖项?特别:
.dll文件/其他项目的引用< - 这是缺少的部分.nupkg从我发现的,你应该做的事情
.csproj要添加的文件<BuildPackage>true</BuildPackage>以包含依赖项.nuspec文件并手动列出你的依赖项(类似吗?)nuget pack您的.nuspec文件但一切都是手工的,这是愚蠢的.即使是半自动解决方案仍然是笨拙或半手动:
.nuspec模板 - 似乎不包含依赖项,只包含元数据nuget pack via build-event(步骤#5),你需要手动添加到每个项目,它有自己的怪癖:
"$(SolutionDir).nuget\NuGet.exe" pack "$(ProjectPath)" -Properties Configuration=Release
move /Y *.nupkg "$(TargetDir)"
我会满足于.nuspec从项目引用中自动创建清单的东西.然后理论上+ nuget构建事件可以汇总到构建项目/ nuget包中,这是我真正想要看到的.
Jul*_*ian 64
您的观点#3(添加对各种.dll文件/其他项目的引用< - 这是缺失的部分)确实包含两个不同的问题:(1)添加对各种dll文件的引用,以及(2)添加对其他项目的引用同样的解决方案.
从NuGet 2.5开始,这里的数字(2)得到了一些额外的支持.在为项目创建NuGet包时,您可以添加一个选项以包含对同一解决方案中其他项目的引用:
nuget pack projectfile.csproj -IncludeReferencedProjects
如果projectfile.csproj引用解决方案中也作为NuGet包公开的任何其他项目,则这些项目的NuGet包将作为依赖项添加.如果它引用了您的解决方案中没有将自己暴露为NuGet包的项目,那么它们的dll将包含在此NuGet包中.
至于(1),如果你发现自己经常在你的项目中添加不能作为NuGet包使用的dll,你可以用这些文件创建你自己的(内部)NuGet包.如果您随后将这些dll作为NuGet包而不是直接添加到文件中,则此NuGet包将成为项目的NuGet包中的依赖项.
joe*_*elc 13
我找到了一篇关于这个主题的写得很好的文章。我对某些具有依赖关系层次结构的包有同样的问题,到目前为止,我一直将每个包作为单独的 NuGet 包上传(这真是浪费时间)
我刚刚测试了在这里找到的解决方案:https : //dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p
在使用 NuGet 包资源管理器检查 NuGet 包后,确实存在引用项目生成的 DLL。我将通过实际将此包提交给 NuGet 并对其进行测试来进行测试。
这是我的来源,以防它对您有所帮助:https : //github.com/jchristn/NuGetPackTest
和测试 NuGet 包:https : //www.nuget.org/packages/NuGetPackTest/1.0.0
该解决方案似乎运行良好。我不知道当有多层引用时它会是什么样子,我敢肯定它会变得非常多毛而且非常快。
来自 NuGetPackTest 库的 .csproj,它引用了项目 TestLibrary(为简洁起见,删除了部分)
<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>
  <ItemGroup>
    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>
  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>
对于其他Google员工,如果您使用NuGet.targets文件运行NuGet Pack,则可以使用以下命令:
<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>
我通过将整个 TargetDir 添加到 nuget 包中解决了这个问题。
只需将其添加到 .csproj 中:
<Target Name="IncludeAllFilesInTargetDir" AfterTargets="Build">
  <ItemGroup>
    <None Include="$(TargetDir)\**">
      <Pack>true</Pack>
      <PackagePath>tools</PackagePath>
    </None>
  </ItemGroup>
</Target>
| 归档时间: | 
 | 
| 查看次数: | 51753 次 | 
| 最近记录: |