Файлы BundlerMinifierCore не копируются при публикации dotnet

У меня было приложение ASP.NET Core 1.1, которое было обновлено с Visual Studio 2015 с помощью project.json до Visual Studio 2017 со стандартом MsBuild csproj. Приложение развертывается в контейнере Docker в Linux, где находятся официальные образы от Microsoft. используются. BundlerMinifier отсутствовали. Но только в докере, а не в Visual Studio 2017 и без использования dotnet publish в Windows 10.

Я узнал, что пакеты были сгенерированы. Но в папке wwwroot решения, а не в выходной папке публикации (передается от --output к dotnet publish). Допустим, у меня есть /app, где мое решение VS находится в док-контейнере. Теперь я запускаю dotnet publish --output /app/output. Мои связанные файлы теперь находятся в /app/src/{projectName}/wwwroot вместо /app/output/wwwroot, где они мне нужны.

Я использую относительные пути в bundleconfig.json следующим образом:

[
    {
        "minify": { "enabled": false },
        "outputFileName": "wwwroot/site.min.css",
        "inputFiles": [
            "wwwroot/lib/my-input-file.css"
        ]
    }
]

Чтобы создать пакет, у меня есть следующие сценарии публикации в моем файле csproj.

  <Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
    <Exec Command="bower install" />
    <Exec Command="dotnet bundle" />
  </Target>

Я не очень хорошо знаком с MsBuild. Но, согласно некоторым исследованиям, следующие строки отвечают за копирование файлов в выходной каталог (например, wwwroot):

  <ItemGroup>
    <None Update="wwwroot\**\*;Views\**\*.cshtml;Areas\**\*.cshtml">
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </None>
  </ItemGroup>

Поскольку wwwroot уже включен здесь и копирование других файлов, таких как Views, работает, я подумал, что есть проблема с порядком выполнения. Что-то вроде MsBuild копирует файлы до того, как MsBuild их опубликует. Но это кажется невозможным по логике, так как это делается до цели PrepareForPublish, которая соответствует Документы Microsoft — правильный путь.


person Lion    schedule 18.03.2017    source источник


Ответы (1)


Это потому, что вы не включаете файлы в wwwroot.

<ItemGroup>
  <None Update="wwwroot\**\*;Views\**\*.cshtml;Areas\**\*.cshtml">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
  </None>
</ItemGroup>

wwwroot\**\* будет копировать только файлы в подпапках wwwroot (по крайней мере, так было со старой структурой project.json), но ваш файл css находится в wwwroot/site.min.css. Так что либо переместите их на wwwroot/css/site.min.css. Или проще: просто опубликуйте копию во всей папке wwwroot (и держите файлы libs за пределами wwwroot, как в bower_modules или npm_modules):

Также я не уверен, что <None> подходит для этого тега. В моем проекте csproj есть только <None Include="App.config" />, а файлы, которые я копирую, находятся в <Content>, как показано ниже.

<ItemGroup>
  <None Include="App.config" />
  <Content Update="wwwroot;Views;Areas;appsettings.json;web.config">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
  </Content>
</ItemGroup>

Поскольку у вас не должно быть никаких несвязанных файлов в представлениях и областях, проще скопировать целые папки.

person Tseng    schedule 18.03.2017
comment
Спасибо, это решило проблему с копированием. Но я обнаружил, что, похоже, есть какая-то ошибка при выполнении dotnet bundle перед PrepareForPublish. Мой текущий обходной путь — вручную вызвать dotnet bundle перед dotnet publish. Это работает вместе с нашим исправлением. - person Lion; 01.04.2017