Измените имя сборки для настроек сборки в .csproj - PullRequest
0 голосов
/ 24 мая 2018

У меня есть приложение, которое я хочу опубликовать с помощью ClickOnce через командную строку.У меня есть тест и живая версия.Должно быть разрешено устанавливать оба одновременно, что означает, что мне нужно изменить имя сборки (и предпочтительно также имя продукта) для одной из сборок.Я хотел бы сделать это в настройках сборки.

Мне удалось сделать некоторые настройки сборки, которые работают нормально, но я не могу понять, как изменить сборку и название продукта, только для одного из них.

Я добавил следующий код в мой файл .csproj, который я вызываю командой msbuild /target:Test или msbuild /target:Live. Но где я могу реализовать сборку и изменение названия продукта?

<PropertyGroup>
  <ProjLocation>$(ProjectDir)</ProjLocation>
  <ProjLocationReleaseDir>$(ProjLocation)\bin\Debug</ProjLocationReleaseDir>
  <ProjPublishLocation>$(ProjLocationReleaseDir)\app.publish</ProjPublishLocation>
  <DeploymentFolder>C:\MyProjects\Software\Publish\</DeploymentFolder>
</PropertyGroup>

<!-- Build settings for live version -->
<Target Name="Live" DependsOnTargets="Clean">

  <MSBuild Projects="$(ProjLocation)\$(ProjectName).csproj"
    Properties="$(DefaultBuildProperties)"
    Targets="Publish"/>

  <ItemGroup>
    <SetupFiles Include="$(ProjPublishLocation)\*.*"/>
    <UpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*"/>
  </ItemGroup>


  <Copy SourceFiles="@(SetupFiles)" DestinationFolder="$(DeploymentFolder)\Live\" />
  <Copy SourceFiles="@(UpdateFiles)" DestinationFolder="$(DeploymentFolder)\Live\Application Files\%(RecursiveDir)"/>
</Target>

<!-- Build settings for test version -->
<Target Name="Test" DependsOnTargets="Clean">

  <MSBuild Projects="$(ProjLocation)\$(ProjectName).csproj"
    Properties="$(DefaultBuildProperties)"
    Targets="Publish"/>

  <ItemGroup>
    <SetupFiles Include="$(ProjPublishLocation)\*.*"/>
    <UpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*"/>
  </ItemGroup>


  <Copy SourceFiles="@(SetupFiles)" DestinationFolder="$(DeploymentFolder)\Public Test\" />
  <Copy SourceFiles="@(UpdateFiles)" DestinationFolder="$(DeploymentFolder)\Public Test\Application Files\%(RecursiveDir)"/>
</Target>

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы можете добавить свойство AssemblyName в PropertyGroup.например:

<PropertyGroup>
  <AssemblyName>YourAppName</AssemblyName>
</PropertyGroup>

или вы можете использовать ключ командной строки MSBuild.как это:

msbuild /property:AssemblyName=YourAppName
0 голосов
/ 24 мая 2018

У меня была почти та же задача (нужно различать Staging и Production), и я решил ее с помощью следующей MSBuild-Target:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- call "nuget restore Deployment\packages.config" before executing this script -->
    <Import Project="..\packages\MSBuildTasks.1.5.0.235\build\MSBuildTasks.targets" />
    <PropertyGroup>
        <Configuration>Release</Configuration>
        <ClientProject>..\MyProject\MyProject.vbproj</ClientProject>
        <ClientPublishDir Condition="$(Environment) == 'Staging'">\\deployment-staging\MyProject\</ClientPublishDir>
        <ClientPublishDir Condition="$(Environment) == 'Production'">\\deployment\MyProject\</ClientPublishDir>
    </PropertyGroup>

    <ItemGroup>  
        <ClientModifiedAppConfig Include="$(ClientProject)\..\App.$(Environment).config" />
    </ItemGroup>

    <Target Name="DeployClient">
        <Error Condition="$(Environment) == ''" Text="The Property 'Environment' has not been set." />
        <Error Condition="$(Environment) != 'Staging' AND $(Environment) != 'Production'" Text="The Property 'Environment' has not been set properly. Valid values are 'Staging' and 'Production'." />

        <!-- Sets different assembly names for INT and PRD applications. Due to this, both INT and PRD applications with the 
        same version number can be installed on the same system. -->
        <XmlUpdate Condition="$(Environment) == 'Staging'" Prefix="n" Namespace="http://schemas.microsoft.com/developer/msbuild/2003" XmlFileName="$(ClientProject)" Xpath="/n:Project/n:PropertyGroup/n:AssemblyName" Value="MyProjectStaging" />
        <XmlUpdate Condition="$(Environment) == 'Staging'" Prefix="n" Namespace="http://schemas.microsoft.com/developer/msbuild/2003" XmlFileName="$(ClientProject)" Xpath="/n:Project/n:PropertyGroup/n:ProductName" Value="MyProject Staging" />
        <XmlUpdate Condition="$(Environment) == 'Production'" Prefix="n" Namespace="http://schemas.microsoft.com/developer/msbuild/2003" XmlFileName="$(ClientProject)" Xpath="/n:Project/n:PropertyGroup/n:AssemblyName" Value="MyProject" />
        <XmlUpdate Condition="$(Environment) == 'Production'" Prefix="n" Namespace="http://schemas.microsoft.com/developer/msbuild/2003" XmlFileName="$(ClientProject)" Xpath="/n:Project/n:PropertyGroup/n:ProductName" Value="MyProject" />

        <!-- Overwrites the original App.config with the environment-dependent App.config.
        Reason: ClickOnce only uses App.config and does not apply transformations, as it is done in Web Projects. -->
        <Copy  
            SourceFiles="@(ClientModifiedAppConfig)"
            DestinationFiles="$(ClientProject)\..\App.config"
            OverwriteReadOnlyFiles="true"
        />

        <!-- Publish -->     
        <MSBuild
            Projects="$(ClientProject)"
            Targets="Publish"
            Properties="
                PublishDir=$(ClientPublishDir);
                Configuration=$(Configuration);
                Platform=x86" />
    </Target>
</Project>

Чтобы это работало, вам нужно восстановить пакет NuGet MSBuildTasks .

Наконец, все, что мне нужно позвонить, это msbuild Deployment.targets /t:DeployClient /p:Environment=Staging

Надеюсь, это поможет!

...