针对不同发布配置文件的不同PrepublishScript

时间:2017-12-15 13:14:43

标签: asp.net-core visual-studio-2017 csproj msbuild-task

我有一个asp.net核心Web应用程序(Visual Studio 2017),在.csproj文件中有一个PrepublishScript目标,在我将应用程序发布到某个位置时(之前)执行。

我有两个不同的发布配置文件,每个配置文件都将应用程序发布到不同的位置并使用不同的设置。

如何为每个发布配置文件使用不同的PrepublishScript目标(或至少在此目标中具有条件执行,具体取决于我发布的发布配置文件)?我不想为所有发布配置文件执行相同的步骤。

有没有办法从每个发布配置文件设置一个变量,可以从msbuild读取并根据该值有条件地执行任务?

1 个答案:

答案 0 :(得分:2)

有几种不同的选择:

  1. 将目标移至发布配置文件。
  2. 发布配置文件只是MSBuild文件,包含项目文件的所有内容。如果配置文件如此不同以至于您无法在配置文件之间真正共享逻辑或管理条件会变得混乱,则将目标添加到发布配置文件是维护配置文件特定逻辑的好方法。

    1. 在发布配置文件中定义属性
    2. 由于它们是MSBuild文件并且已经包含PropertyGroup元素,因此您可以在此文件中定义任何自定义属性,并在目标内使用它或作为目标上的条件。

      E.g。在my.pubxml文件中:

      <PropertyGroup>
        <PublishFooConfigFile>true</PublishFooConfigFile>
      </PropertyGroup>
      

      然后可以在主csproj文件中使用它:

      <Target Name="IncludeFooConfig" AfterTargets="ComputeFilesToPublish" Condition="'$(PublishFooConfigFile)' == 'true'">
        <ItemGroup>
          <ResolvedFileToPublish Include="config" RelativePath="%(Identity)" CopyToPublishDirectory="PreserveNewest" />
        </ItemGroup>
      </Target>
      
      1. 使用PublishProfile属性作为条件
      2. 当您使用例如/p:PublishProfile=Foo,您还可以将$(PublishProfile)用于MSBuild条件,但这是不良做法,因为它会对可能不需要对实际操作执行任何操作的配置文件名称进行硬编码逻辑以及指定发布配置文件的其他方法可以打破这种逻辑。