Как Nuget упаковать / преобразовать несколько файлов web.config - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть решение 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 (все это отлично работает). Проблема в том, что упаковывается только web.config.transform в MainUtilsProject. Другие файлы web.configs либо не копируются, либо перезаписываются, либо не преобразуются. "Копировать всегда" устанавливается для этих файлов.

В узле файлов * nuspe c есть

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

.

Я знаю, что они все с тем же именем и что последний вход будет единственным, существующим после сборки, но если я переименую web.configs в других проектах, все они будут скопированы в папку bin, но команда 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>

Это вообще возможно?

Спасибо

1 Ответ

1 голос
/ 07 апреля 2020

Как Nuget упаковать / преобразовать несколько файлов web.config

Я думаю, вы должны сначала объединить все файлы web.config в один файл в вашем проекте, а затем упаковать этот новый один web.config файл в nuspe c, который будет соответствовать вашим требованиям.

1) первая установка MSBuildTasks nuget пакет в MainUtilsProject

2) добавить эти пользовательские цели в MainUtilsProject, чтобы объединить эти файлы веб-конфигурации в новый отдельный файл:

<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 в nuspe c file

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

Примечание : если вы используете формат PackageReference для установки этого пакета, вы должны использовать contentfiles node для объявления этого файла. См. эту проблему .

Кроме того, , эти целевые файлы имеют некоторый лог c в зависимости от ваших требований, поэтому предоставленные мною методы определены c для Ваша специфицированная c структура файла проекта.

...