如何 Nuget package/transform 多个 web.config 文件

How to Nuget package/transform multiple web.config files

我有一个看起来像这样的 Visual Studio 2019 解决方案,我想将它打包到一个 nuget 存储库中:

-Solution
  +Project1
     (no web.config file)
  +Project2
    -web.config.transform
       <appSettings> 
           <add key="Project2Key" value="p2value" />
        </appSettings>
  +Project3
    -web.config.transform
       <appSettings> 
          <add key="Project3Key" value="p3value" />
        </appSettings>

        <customSettingsForProject3> 
          .....
        </customSettingsForProject3>
  +MainUtilsProject
    -web.config.transform
       <appSettings> 
           <add key="MainUtilsProjectKey" value="mainValue" />
        </appSettings>

编译时,它会运行 nuget pack 命令来生成 nuget 包(一切正常)。 问题是只有 MainUtilsProject 中的 web.config.transform 被打包。其他 web.configs 要么没有被复制,要么没有被覆盖,要么没有被转换。 "Copy Always" 在这些文件上设置。

nuspec 有

<file src="web.config.transform" target="Content" />

在文件节点中。

我知道它们都是同名的,最后一个将是构建后唯一存在的,但是如果我在其他项目中重命名 web.configs 它们都会被复制到bin 文件夹,但如果我尝试引用它们说 "file not found".

,则 nuget pack 命令失败

最终目标是让下载 nuget 包的消费项目将 web.configs 的相关部分安装到它自己的 web.config 中。这很完美,但仅适用于 MainUtilsProject 文件(在下面的示例中,它只插入了 MainUtilsProject 的密钥)

那么我怎样才能将所有项目的 web.configs 合并到一个文件中并打包到 nuget 包中呢?请记住,项目也可以作为独立项目存在,有自己的 web.configs.

在消费项目中,安装 nuget 包后,我希望在 web.config 文件中看到:

<appSettings> 
  <add key="Project2Key" value="p2value" />
  <add key="Project3Key" value="p3value" />
  <add key="MainUtilsProjectKey" value="mainValue" />
</appSettings>

<customSettingsForProject3> 
  .....
</customSettingsForProject3>

这可能吗?

谢谢

How to Nuget package/transform multiple web.config files

我认为您应该首先将所有 web.config 文件合并到项目中的一个文件中,然后将这个新的单个 web.config 文件打包到 nuspec 中,这将满足您的要求。

1) 首先将 MSBuildTasks nuget package 安装到 MainUtilsProject

2) 将这些自定义目标添加到 MainUtilsProject 中以将这些 Web 配置文件合并到一个新的单个文件中:

<Target Name="merge1" BeforeTargets="Build">

    <XmlMassUpdate
               ContentFile="web.config.transform"
               ContentRoot="configuration"
               SubstitutionsFile="..\Project2\web.config.transform"
               SubstitutionsRoot="configuration/appSettings" 
               MergedFile="web.new1.config.transform"
            />
  </Target>

  <Target Name="merge2" AfterTargets="merge1">
    <XmlMassUpdate
           ContentFile="web.new1.config.transform"
           ContentRoot="configuration"
           SubstitutionsFile="..\Project3\web.config.transform"
           SubstitutionsRoot="configuration"
           MergedFile="web.new2.config.transform"
            />
    <Delete Files="web.new1.config.transform"></Delete>

  </Target>
  <Target Name="merge3" AfterTargets="merge2">
    <XmlMassUpdate
           ContentFile="web.new2.config.transform"
           ContentRoot="configuration/appSettings"
           SubstitutionsFile="App.config.transform"
           SubstitutionsRoot="configuration"
           MergedFile="web.new.finally.config.transform"
            />
    <Delete Files="web.new2.config.transform"></Delete>

  </Target>

3) 然后打包 web.new.finally.config.transform 到 nuspec 文件

<file src="web.new.finally.config.transform" target="Content" />

注意:如果你使用PackageReference格式来安装这个包,你应该使用contentfiles node to declare this file. See .

另外,这些目标文件根据你的要求有一些逻辑,所以我提供的方法是针对你具体的项目文件结构的。