Install.ps1 или Web.config.transform - что происходит первым? - PullRequest
1 голос
/ 26 марта 2012

Итак, мне наконец действительно нужно что-то сделать с Web.config, который не поддерживается системой NuGet Web.config.transform.

И, потратив 2 часа на поиск документов, я понял, что нет слов о том, происходит ли Install.ps1 до или после применения Web.config.transform.

Я использовал для определения файла Web.config.transform следующим образом:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="resizer" type="ImageResizer.ResizerSection"/>
  </configSections>
</configuration>

Вот новый - атрибут requirePermission="false" необходим для поддержки Medium Trust.

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="resizer" type="ImageResizer.ResizerSection" requirePermission="false"/>
  </configSections>
</configuration>

Если я выпущу новую версию Web.config.transform, это приведет к сбою в их проекте ASP.NET, так как будет два элемента section:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="resizer" type="ImageResizer.ResizerSection" />
    <section name="resizer" type="ImageResizer.ResizerSection" requirePermission="false"/>
  </configSections>
</configuration>

Если Install.ps1 происходит до Web.config.transform, я могу просто удалить все совпадения до configuration/configSections/section[@name='resizer']. Если это произойдет после , тогда мне нужно выбрать один из дубликатов для удаления.

Это довольно простая проблема, но на интернет-форуме пока нет ответа, и я надеюсь опубликовать ее, чтобы облегчить жизнь следующему Наггеттеру.

1 Ответ

1 голос
/ 27 марта 2012

Я только что прочитал код NuGet, и install.ps1 происходит после Web.config.transform.

В приведенном ниже коде NuGet Web.config.transform вызывается в ExtractPackageFilesToProject, а installs.ps1 вызывается в последнем событии OnPackagageReferenceAdded:

    protected void AddPackageReferenceToProject(IPackage package)
    {
        PackageOperationEventArgs args = CreateOperation(package);
        OnPackageReferenceAdding(args);

        if (args.Cancel)
        {
            return;
        }

        ExtractPackageFilesToProject(package);

        Logger.Log(MessageLevel.Info, NuGetResources.Log_SuccessfullyAddedPackageReference, package.GetFullName(), Project.ProjectName);
        OnPackageReferenceAdded(args);
    }


    private void OnPackageReferenceAdded(object sender, PackageOperationEventArgs e)
    {
        Project project = FindProjectFromFileSystem(e.FileSystem);
        Debug.Assert(project != null);
        _providerServices.ScriptExecutor.ExecuteScript(e.InstallPath, PowerShellScripts.Install, e.Package, project, this);
    }
...