2013-07-11 102 views
4

我想使用web部署將Visual Studio「Console」應用程序發佈到目標系統上的文件夾。如何使用Web發佈管道和Web部署(MSDEPLOY)發佈控制檯應用程序?

我有一些運氣,並能夠產生類似於我所需要的東西,但不完全。

我已經添加了以下控制檯的.csproj:

增加了以下PROJECTNAME .wpp.targets文件

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> 

,我已經添加了以下PROJECTNAME .wpp .targets:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 

    <PropertyGroup> 
    <DeployAsIisApp>false</DeployAsIisApp> 
    <IncludeSetAclProviderOnDestination>false</IncludeSetAclProviderOnDestination> 
    </PropertyGroup> 
    <ItemGroup> 
    <FilesForPackagingFromProject Include="$(IntermediateOutputPath)$(TargetFileName).config"> 
     <DestinationRelativePath>bin\%(RecursiveDir)%(FileName)%(Extension)</DestinationRelativePath> 
     <FromTarget>projectName.wpp.targets</FromTarget> 
    </FilesForPackagingFromProject> 
    </ItemGroup> 
</Project> 

然後編輯.SetParameters.xml文件,如下所示:

<parameters> 
    <setParameter name="IIS Web Application Name" value="c:\company\project" /> 
</parameters> 

當我再使用生成的.cmd文件部署,我得到部署到C中的所有文件:\企業\項目\ bin中。

這並不壞,但我想做得更好。特別是,我想省略「bin」文件夾並將所有文件放在「C:\ company \ project」文件夾中,我希望能夠指定ACL

有沒有人能夠解決這些問題?

+0

您是否嘗試從「 bin \%(RecursiveDir)%(FileName)%(Extension)」中刪除「bin \」部分? –

+0

聽起來這可能是一個答案。你應該在這裏添加一個答案。 3小時內賞金。 –

+0

@ aleksey.berezan:你應該添加它作爲答案 –

回答

4

好吧,所以這裏是如何省略'bin'文件夾的方式。首先,我想強調的是,所有與msdeploy相關的東西都是針對web應用程序部署的,'bin'文件夾對我來說似乎是,幾乎在的硬編碼深處。所以如果你想擺脫它 - 你必須做一些骯髒的事情。我做了哪些。

我們必須稍微改變$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets項目,所以最好不要改變它,但它是複製品。

步驟:

。備份$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets(或者,你可以安裝MSBuild.Microsoft.VisualStudio.Web.targets包,您的csproj文件重定向到從包獲得Microsoft.WebApplication.targets文件,並使用它)。
2.在$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplicaton.targets找到看起來像<CopyPipelineFiles PipelineItems="@(FilesForPackagingFromProject)"的xml節點(其中有幾個節點,從〜2570行開始)。
3.註釋節點出來,請用自定義的,所以最終會看起來像:

<!-- 
<CopyPipelineFiles PipelineItems="@(FilesForPackagingFromProject)" 
         SourceDirectory="$(WebPublishPipelineProjectDirectory)" 
         TargetDirectory="$(WPPAllFilesInSingleFolder)" 
         SkipMetadataExcludeTrueItems="True" 
         UpdateItemSpec="True" 
         DeleteItemsMarkAsExcludeTrue ="True" 
        Condition="'@(FilesForPackagingFromProject)' != ''"> 
    <Output TaskParameter="ResultPipelineItems" ItemName="_FilesForPackagingFromProjectTempory"/> 
</CopyPipelineFiles>--> 

<!-- Copying files to package folder in 'custom'(dirty) way --> 
<CreateItem Include="$(OutputPath)\**\*.*"> 
    <Output TaskParameter="Include" ItemName="YourFilesToCopy" /> 
</CreateItem> 
<Copy SourceFiles="@(YourFilesToCopy)" 
     DestinationFiles="@(YourFilesToCopy->'$(WPPAllFilesInSingleFolder)\%(RecursiveDir)%(Filename)%(Extension)')" /> 

然後
4.您PROJECTNAME .wpp.targets不必有FilesForPackagingFromProject,所以它看起來像:

<!-- targets --> 
    <PropertyGroup> 
     <DeployAsIisApp>false</DeployAsIisApp> 
     <IncludeSetAclProviderOnDestination>false</IncludeSetAclProviderOnDestination> 
    </PropertyGroup> 
    <ItemGroup> 
    <!-- intentionally left blank --> 
    </ItemGroup> 
    </Project> 

就是這樣。爲我工作(tm),經過測試。說實話,我不喜歡這種方法,但那是我以必要的方式進行工作的唯一方式。無論您是否將其用於項目,取決於您。

我的意見不是在這裏使用msdeploy - 它不適合你的任務。
最好從頭開始編寫msbuild腳本或接受'bin'文件夾,並在需要下一次定製時再次與框架對抗。

+0

我同意這一般不是一個好主意。這很方便,因爲它意味着應用程序的所有組件都可以通過MSDEPLOY部署到所有環境中。這是擺脫控制檯應用程序的MSI安裝程序的一部分。 MSI安裝程序除了複製文件外沒有其他任何操作。 –

+0

此外,我試圖設置ACL的,面臨錯誤消息'ERROR_SITE_DOES_NOT_EXIST',發現[SO主題](https://stackoverflow.com/questions/6861990/can-web-deploys-setacl-provider-在子目錄上使用)與註釋類似的問題'這似乎不適用於沒有推入虛擬目錄並被推送到默認站點/實例的應用程序......所以我認爲設置ACL不適合你。 MSI/Wix更好。 –

+0

確實如此,但安裝項目在VS2012/2013中不受支持,Wix甚至InstallShield都有很大的學習曲線。 MSDEPLOY「工作」,我唯一的問題就是上面的問題。感謝你的回答。 –

相關問題