2014-04-24 1 views
0

WPF 응용 프로그램은 ClickOnce과 함께 배포됩니다.NANT 스크립트를 사용한 ClickOnce 응용 프로그램 게시

Visual Studio에서 "Project properties/Publish"을 엽니 다. 이

내가 가진 : URL 게시

  • 위치에 게시

    • 버전
    • 서명

    문제는 내가 테스트 및 생산을위한 모든 버전을 게시해야한다는이며, . 이들의 차이점은 publish locationpublish URL입니다. 현재 프로덕션을 위해 게시하기 전에 값을 변경하면서이 프로세스를 두 번 실행해야합니다.

    따라서 publish를 누르면 "ApplicationFiles"폴더, application manifest 파일 및 setup.exe 폴더가 포함 된 폴더가됩니다.

    그런 다음 NANT를 사용하여이 프로세스를 자동화하기로 결정했습니다.

    나는 게시자를 설정하지 않는 빌드를 발견이와

    <target name="BuildTestApplication" depends="Clean" description="Build"> 
        <echo message="Building..." />  
        <exec program="${msbuildExe}" workingdir="." verbose="true"> 
        <arg value="${projectFile}" /> 
        <arg value="/target:Clean;Publish" /> 
        <arg value="/p:PublishDir=${testPublishFolder}" /> 
        <arg value="/p:ApplicationVersion=${version}" /> 
        <arg value="/p:Publisher=&quot;${publisherName}&quot;" /> 
        </exec> 
        <echo message="Built" /> 
    </target> 
    

    (폴더 및 애플리케이션 varsion을 게시, 여기에 내가 .csproj 파일 위치를 설정) 테스트를 위해 먼저 응용 프로그램을 게시/구축 할 수 있습니다. 또한 애플리케이션이 인터넷을 통해 설치되기 때문에 제공자 URL을 변경해야합니다 (테스트 및 프로덕션을위한 다른 URL). 그래서 내가 그랬어 : 나는 올바른 값 (PublisherProviderUrl)와 application manifest 파일을 업데이트 한이와

    <target name="UpdateTestApplication" depends="BuildTestApplication" description="Update"> 
        <echo message="Updating..." />  
        <exec program="${mageExe}" workingdir="." verbose="true"> 
        <arg value="-Update" /> 
        <arg value="${testPublishFolder}/EdpClient.application" /> 
        <arg value="-ProviderUrl" /> 
        <arg value="&quot;${testPublishUrl}&quot;" /> 
        <arg value="-Publisher" /> 
        <arg value="&quot;${publisherName}&quot;" /> 
        </exec> 
        <echo message="Updated" /> 
    </target> 
    

    ...

    나는 내가 다른 폴더로 응용 프로그램을 빌드 의미 생산 빌드 동일한 작업을 수행 및

    이제 문제는 setup.exe 파일입니다 ... 다른 ProviderUrl로 업데이트하고 모든 mage 업데이트에 포함되어야하기 때문에, Publisher를 추가합니다. Setup.exe은 빌드시 생성되며 .csproj 파일에서 값을 가져옵니다.

    1 올바른 매개 변수를 사용하여 응용 프로그램을 작성하는 방법이 있나요 때문에 setup.exe 올바른 값을 포함합니다 :

    위의 모든 내가 세 가지 문제를 고려?

    빌드하기 전에 어셈블리 정보 (매개 변수 버전)를 어떻게 업데이트합니까? VS에서 게시 할 때 "Probject properties/Application/Assembly Information"

    3으로 업데이트해야합니다. VS에서 게시 할 때 으로 게시하는 동안 "Application Files"폴더에도 응용 프로그램 매니페스트 파일이 생성됩니다. 왜 그런가요?

    사전 및 안부, no9에 감사

    편집 :

    <!--UPDATE ASSEMBLY INFORMATION BEFORE BUILD--> 
        <target name="UpdateAssemblyInfo"> 
        <asminfo output="${assemblyInfoFile}" language="CSharp"> 
         <imports> 
         <import namespace="System" /> 
         <import namespace="System.Reflection" /> 
         <import namespace="System.Resources" /> 
         <import namespace="System.Runtime.CompilerServices" /> 
         <import namespace="System.Runtime.InteropServices" /> 
         <import namespace="System.Windows" /> 
         </imports> 
         <attributes> 
         <attribute type="AssemblyTitleAttribute" value="some value" /> 
         <attribute type="AssemblyDescriptionAttribute" value="some value" /> 
         <attribute type="AssemblyConfigurationAttribute" value="some value" /> 
         <attribute type="AssemblyCompanyAttribute" value="some value" /> 
         <attribute type="AssemblyProductAttribute" value="some value" /> 
         <attribute type="AssemblyVersionAttribute" value="some value" /> 
         <attribute type="AssemblyFileVersionAttribute" value="some value" /> 
         <attribute type="AssemblyCopyrightAttribute" value="some value" /> 
         <attribute type="AssemblyTrademarkAttribute" value="some value" /> 
         <attribute type="AssemblyCultureAttribute" value="some value" /> 
         <attribute type="CLSCompliantAttribute" value="boolean value" /> 
         <attribute type="ComVisibleAttribute" value="boolean value" /> 
         </attributes> 
        </asminfo> 
        <echo file="${assemblyInfoFile}" append="true"> 
    [assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
    )] 
        </echo> 
        <echo message="Updated" /> 
        </target> 
    

    내가 빌드하기 전에 Assembly.info 파일을 오버라이드 (override) 의미 : 나는 문제 # 그래서 추천을 고정

    관련 값을 추가하십시오.

    그리고 문제 #3과 같이 :

    <!--COPY APPLICATION MANIFEST TO APPLICATIONFILES FOLDER--> 
         <target name="CopyTestApplicationManifestToApplicationFilesFolder"  depends="Dependency target name" description="Update"> 
         <echo message="Copying..." /> 
         <copy 
         file="source file" 
         tofile="target file" /> 
         <echo message="Copied" /> 
        </target> 
    
  • +0

    콘솔 응용 프로그램을 빌드하고 사용하기 전에 건물 자체에 대한 콘솔 응용 프로그램을 호출하는 것이 가능한 해결책일까요? 아니면 NANT가 될까요? – Herdo

    답변

    0

    나는 명시 적으로 로그인 할 필요없이 제대로 귀하의 질문 (setup.exe를 응용 프로그램 폴더 등)에 언급 된 자산을 생성 작업을 생성 할 수 있었다 명백한.

    은 "clean_and_publish_application"작업은 내가 내 게시 URL, BootstrapperSDKPath, 응용 프로그램 버전을 지정하는 몇 가지 매개 변수를 제공 여기 ** 프로젝트

  • 프로젝트를 게시 프로젝트
  • 을 다시 다음

    1. 청소를하지 , 및 응용 개정판

      <target name="clean_and_publish_application" description="Build the application."> 
      <echo message="Clean the build directory"/> 
      <msbuild project ="${src.dir}\${target.assembly.name}.csproj"> 
           <arg value="/property:Configuration=Debug;outdir=bin\Debug" /> 
           <arg value="/t:clean" /> 
      </msbuild> 
      <echo message="Rebuild the application"/> 
      <msbuild project ="${src.dir}\${target.assembly.name}.csproj"> 
      <arg value="/property:Configuration=Debug;outdir=bin\Debug" /> 
      <arg value="/t:rebuild" /> 
      </msbuild> 
      <echo message="Publish the application"/> 
      <msbuild project ="${src.dir}\${target.assembly.name}.csproj"> 
      <arg value="/p:publishurl=${publish.url}; 
      GenerateBootstrapperSdkPath= 
      C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\Bootstrapper\; 
      ApplicationVersion=${app.version}; 
      ApplicationRevision=${app.revision}" /> 
      <arg value="/t:publish" /> 
      </msbuild> 
      </target> 
      

    BootstrapperSdkPath 등록 정보는 setup.exe 파일 작성에 필요합니다. 나는 변화가 없기 때문에 위치를 하드 코딩했다. MSBuild는 해당 디렉토리 내의 setup.bin 파일을 찾습니다.

    ApplicationVersion 속성이 예 2.0.0. %의 2A에 대한 서식이

    ApplicationRevision 속성이 값은 우리가 비주얼 스튜디오에서 볼 버전을 게시합니다. 실제로 업데이트하지 않을 수 있습니다 (예 : 24 숫자로 포맷 AssemplyInfo.cs 파일).

    .csproj 파일에 나열된 모든 속성은 msbuild의 인수로 전달할 수 있습니다. 이 문서가 매우 도움이되었다는 것을 알았습니다. MSBuild Command-Line Reference

    위의 작업은 필요한 경우를 제외하고 실제로 파일을 게시 URL에 복사합니다 (여전히 이에 대한 답변 찾기). 따라서 게시가 생성하는 app.config 디렉토리의 모든 파일을 수동으로 복사합니다.

    <target name="copy_src"> 
    <echo message="Copying app.config folder"/> 
        <copy todir="${publish.url}" overwrite="true" failonerror="true"> 
         <fileset basedir="${src.dir}\${app.config.location}"> 
          <include name="**" /> 
         </fileset> 
        </copy> 
    </target> 
    

    저는 Team City에서이 스크립트를 실행하고 있습니다. 게시 대상을 사용했기 때문에 매니페스트에 서명하는 것에 대해 걱정할 필요가 없었습니다. 또한, 여기에서 다운로드 할 수있는 NAnt.Contrib.Tasks.dll의 msbuild 작업을 사용합니다. NAntContrib