visual-studio - 将 nuget 包中的内容文件设置为 "copy local : always"

标签 visual-studio visual-studio-2012 nuget nuget-package copy-local

我在构建后事件中使用此命令从项目生成 nuget 包。变量 %conf% 设置为正确的配置(调试或发布),%1 是项目名称(例如“MyCompany.MyProject”)。

nuget pack -Prop Configuration=%conf% "%1.csproj" -exclude *.sql -IncludeReferencedProjects

此包仅供我们自己使用,永远不会在 nuget 上发布。它以我们的私有(private)存储库结束。

在项目中,有一个文件设置为生成操作:内容复制本地:始终。 (我的 Visual Studio 是法语的,所以我不能 100% 确定翻译)。我们将其命名为 importantfile.xml

在生成的包中,我最终得到以下结构:

- content
    - importantfile.xml
- lib
    -net45 (.NetFramework,Version=v4.5)
        -MyCompany.MyProject.dll

这很好,我希望将 importantfile.xml 部署到包中,因为这个文件很重要!

当我在另一个项目中安装该包时,importantfile.xml 部署在项目的根目录下。没关系。但它没有设置为始终复制本地

我需要在安装包的项目中importantfile.xml复制本地:始终

我怎样才能实现这一目标?

注释:

可以在安装软件包后立即在文件上设置copy local :always,这没什么大不了的。如果以后的包更新会让这个属性保持原样,我会接受它,但事实并非如此。更新软件包时,copy local 会重置为 never(如所述 here )。

项目文件夹中有一个 nuspec 文件,如下:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <copyright>Copyright 2014</copyright>
    <tags>some random tags</tags>
  </metadata>
</package>

最佳答案

除了使用 PowerShell 脚本,另一种方法是使用 MSBuild targets or props file与包 ID 同名:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="$(MSBuildThisFileDirectory)importantfile.xml">
      <Link>importantfile.xml</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

然后在 nuspec 文件中,不要将所需文件添加到 Content 目录,而是将它们与目标文件一起添加到 Build 目录。

  • 构建
    • 重要文件.xml
    • MyPackage.targets
    • net45
      • MyAssembly.dll

如果您需要针对不同架构的不同内容,则可以在 Build 下添加架构文件夹,每个文件夹都有自己的目标文件。

通过 PowerShell 脚本在 NuGet Content 目录中使用目标文件的好处:

  • Visual Studio 中的项目中未显示所需的内容文件
  • 内容文件链接到而不是复制到引用 NuGet 包的每个项目的目录中(防止存在多个副本并保持与 NuGet 包中的程序集/库相同的行为)
  • PowerShell 脚本仅适用于 Visual Studio 和 aren't run when NuGet is run from the commandline (构建服务器、其他 IDE 和其他操作系统),这种方法将适用于任何地方
  • PowerShell 安装脚本为 not supported in NuGet 3.x project.json system .

关于visual-studio - 将 nuget 包中的内容文件设置为 "copy local : always",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21143817/

相关文章:

visual-studio-2010 - 将NuGet软件包文件夹添加到解决方案文件?

c# - 使用构建后操作创建 nuget 包

javascript - 我可以恢复我的JavaScript文件吗?

c# - 嵌套文件时嵌入的资源名称丢失扩展名

c++ - 如何在 Visual Studio 2012 中包含库?

asp.net - 在.NET中管理多个服务引用的最佳方法

asp.net-mvc - 无法找到包 ""的版本 ""

c++ - 在 VS 中构建由 Boost 驱动的解决方案

c++ - 值初始化 : MSVC vs clang

visual-studio - Productivity Power Tools for Visual Studio 已禁用且不会启用