Visual studio 如何Nuget打包/转换多个web.config文件

Visual studio 如何Nuget打包/转换多个web.config文件,visual-studio,nuget,nuget-package-restore,Visual Studio,Nuget,Nuget Package Restore,我有一个Visual Studio 2019解决方案,看起来像这样,我想将其打包到nuget回购中: -Solution +Project1 (no web.config file) +Project2 -web.config.transform <appSettings> <add key="Project2Key" value="p2value" /> </appSettings&g

我有一个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>
-解决方案
+项目1
(没有web.config文件)
+项目2
-web.config.transform
+项目3
-web.config.transform
.....
+维护项目
-web.config.transform
编译时,它运行nuget-pack命令生成一个nuget包(一切正常)。 问题是只有MainUtilsProject中的web.config.transform被打包。其他web.config未被复制、覆盖或转换。在这些文件上设置“始终复制”

nuspec已经

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

在“文件”节点中

我知道它们都是相同的名称,并且中的最后一个将是生成后唯一存在的名称,但是如果我在其他项目中重命名web.configs,它们都会被复制到bin文件夹中,但是如果我尝试引用它们说“未找到文件”,则nuget pack命令将失败

最终目标是让下载nuget包的消费项目将web.config的相关部分安装到自己的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>

.....
有可能吗

谢谢

如何Nuget打包/转换多个web.config文件

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

1)首先安装到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>
注意:如果使用PackageReference格式安装此软件包,则应使用来声明此文件。看


此外这些目标文件根据您的需求有一些逻辑,因此我提供的方法是针对您特定的项目文件结构的。

当您说“将这些自定义目标添加到MainUtilProject”时,是该项目中的文件还是文件的一部分?此外,消费项目可以是packageReference或packageConfig,这有什么不同吗?上面的Scratch,找到了。该xml被添加到项目文件中。谢谢
<file src="web.new.finally.config.transform" target="Content" />