.net Nuget包生成排除lib文件夹

ac1kyiln  于 2023-01-22  发布在  .NET
关注(0)|答案(9)|浏览(152)

我正在尝试用. nuspec文件生成nuget包。我们有几个项目在一个屋檐下,并试图创建nlog.config(和转换文件)并通过nuget包分发。对于任何版本的。net框架,我正在寻找相同的配置文件集(只有configs没有dll)。所以我真的不需要\lib\net45\myproject.dll或\lib\net40\myproject.dll。虽然当我生成nuget包时,它总是创建lib文件夹并包含dll,这会为任何与. net framework版本相关的项目创建依赖项。
下面是我的nuspec文件,以防有人想参考,如果我做错了什么。我尝试了""和其他几件事,但没有运气。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>NLogConfig</id>
    <version>1.0.3</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <copyright>Copyright 2013</copyright>
    <dependencies>
      <dependency id="NLog" version="2.1.0" />
      <dependency id="NLog.Schema" version="2.1.0" />
    </dependencies>
  </metadata>
  <files>    
    <file src="NLog.config" target="content" />
    <file src="NLog.Debug.config" target="content" />
    <file src="NLog.UAT.config" target="content" />
    <file src="NLog.Release.config" target="content" />
    <file src="tools\*.*" target="tools"/>          
  </files>
</package>

我怎样才能完全排除lib文件夹使用nuspec文件(首选)或其他机制?谢谢!!

    • 更新1:**

我尝试偷偷地,但没有成功。我把后生成事件,并试图删除DLL。但不知何故,系统是聪明的,它给了我错误"错误79无法找到'C:\GITRepo\NLogConfig\NLogConfig\bin\Release\NLogConfig.dll'。请确保该项目已生成。"

    • 更新2**

我没有找到使用. csproj来构建nuget包的方法,但是使用外部命令并指定nuspec文件,我能够达到相同的结果。问题仍然存在,这只是我的解决方法。

rjee0c15

rjee0c151#

我想分享我的经验。我需要的是使用csproj作为Nuget.exe目标(因为我希望NuGet自动解析依赖项),并且在结果包中不使用lib文件夹。为了省略该文件夹,我使用了以下命令:

nuget pack <projectPath> -Exclude bin/**/*.*
fcipmucu

fcipmucu2#

使用NuGet Pack命令选项-工具。参见https://learn.microsoft.com/en-us/nuget/tools/cli-ref-pack
“确定项目的输出文件是否应位于工具文件夹中.”

raogr8fs

raogr8fs3#

我通过首先从项目的输出文件夹中排除所有文件来解决这个问题

<file src="bin\**\*.*" target="lib\net451" exclude="bin\**\*.*" />

然后当实际通过NuGet.exe打包时,我把目标对准了.nuspec而不是csproj,结果包在/lib文件夹下没有包含我项目的输出dll。

9avjhtql

9avjhtql4#

当您按项目打包时,这是预期的行为,因为关键是Nuget将读取项目并相应地生成包。而且找到的任何.Nuspec都只能添加内容,而不能删除以前添加的任何内容。
因此,您要注意的是,您的第二次更新是您应该做的-由.nuspec打包代替。

zvms9eto

zvms9eto5#

你可以通过使用exclude语法来保持lib文件包含在包中,如下所示:

<files>
<file src="bin\Debug\*.*" exclude="bin\Debug\*.dll" />
</files>

有关详细信息,请参阅http://docs.nuget.org/docs/reference/nuspec-reference

3zwjbxry

3zwjbxry6#

你必须删除dependencies元素和直到你将使用一个项目来构建一个包nuget将添加一个引用到那些dlls

<?xml version="1.0"?>
<package >
  <metadata>
    <id>NLogConfig</id>
    <version>1.0.3</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <copyright>Copyright 2013</copyright>
  </metadata>
  <files>    
    <file src="NLog.config" target="content" />
    <file src="NLog.Debug.config" target="content" />
    <file src="NLog.UAT.config" target="content" />
    <file src="NLog.Release.config" target="content" />
    <file src="tools\*.*" target="tools"/>          
  </files>
</package>
of1yzvn4

of1yzvn47#

我也遇到了这个问题,我的问题与您的变通方案,即从项目中分离包的创建,是我不能使用通配符在nuspec文件。我的变通方案是使用install.ps1 PowerShell脚本,它将运行后,添加包到一个项目。但是,您需要设置ExecutionPolicy首先在包管理器控制台,以便PowerShell脚本可以运行。

param($installPath, $toolsPath, $package, $project)
$project.Object.References | Where-Object { $_.Name -eq 'NLogConfig' } | ForEach-Object { $_.Remove() }

我真的不喜欢这个变通方案,因为它将无法在默认情况下限制ExecutionPolicy的计算机上运行。

z31licg0

z31licg08#

所以我也遇到了同样的问题,我并不关心. dll是否包含在内,但我的内容中包含了. cs,因为这样一来,类将同时存在于添加到目标项目的内容和安装包时添加的dll中(我猜您正在沿着相同的路线做一些事情)。
我最终将内容文件夹中的. cs文件的构建操作更改为NONE,这样它们就不会出现在DLL中。

    • 注意:**当您执行此操作时,. cs文件中的任何代码都不会得到验证,因此当您确定一切正常时,您会希望将此操作作为最后一步

完全排除DLL是很好的,但这是我使用项目作为构建的变通方案。
希望这能帮助到一些人

bbmckpt7

bbmckpt79#

尝试将这一行添加到您的项目文件中,对我有效:

<None Remove="bin\**\*.*"/>

相关问题