2011-02-01 30 views
15

Tôi đang cố gắng chạy một lệnh như một phần của quá trình đóng gói/triển khai của tôi qua MSDeploy. Đặc biệt, tôi đang cố gắng tạo nhật ký sự kiện tùy chỉnh bằng cách chạy installutil đối với một trong các tệp DLL của mình, nhưng tôi gặp sự cố khi chỉ định đường dẫn tương đối tương đối cho DLL từ thư mục triển khai. Để bắt đầu, tôi đã thêm cấu hình bên dưới vào csproj của mình để tạo nhà cung cấp runCommand bên trong tệp kê khai của tôi. Xin lưu ý đường dẫn tuyệt đối cho DLL.MSDeploy runCommand sử dụng đường dẫn tương đối

<PropertyGroup> 
    <!-- Extends the AfterAddIisSettingAndFileContentsToSourceManifest action to create Custom Event Log --> 
    <IncludeEventLogCreation>TRUE</IncludeEventLogCreation> 
    <AfterAddIisSettingAndFileContentsToSourceManifest Condition="'$(AfterAddIisSettingAndFileContentsToSourceManifest)'==''"> 
     $(AfterAddIisSettingAndFileContentsToSourceManifest); 
     CreateEventLog; 
    </AfterAddIisSettingAndFileContentsToSourceManifest> 
    </PropertyGroup> 
    <Target Name="CreateEventLog" Condition="'$(IncludeEventLogCreation)'=='TRUE'"> 
    <Message Text="Creating Event Log" /> 
    <ItemGroup> 
     <MsDeploySourceManifest Include="runCommand"> 
     <path>installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll</path> 
     </MsDeploySourceManifest> 
    </ItemGroup> 
    </Target> 
    <ItemGroup> 

Sau khi gọi msbuild, điều này tạo ra tệp kê khai của tôi đúng trong gói package.zip của tôi. Khi tôi chạy MyTestApp.deploy.cmd/Y nó được gọi một cách chính xác msdeploy và triển khai tác phẩm của tôi để inetpub \ wwwroot \ MyTestApp và chạy lệnh của tôi từ manifest dưới đây:

<runCommand path="installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll ... etc 

Vấn đề tôi đang gặp là tôi làm không muốn hardcode đường dẫn DLL này vào c: \ inetpub \ etc. Làm cách nào để thực hiện cuộc gọi ở trên bằng cách sử dụng đường dẫn tương đối tương đối từ thư mục triển khai của tôi trong Trang web mặc định? Lý tưởng nhất, tôi muốn MSDeploy để thực hiện đường dẫn này và chuyển nó làm biến cho lệnh runCommand để tìm DLL. Sau đó, tôi có thể viết một cái gì đó như: <path>installutil $DeploymentDir\NewTestApp\bin\BusinessLayer.dll</path> mà không cần phải lo lắng về việc mã hóa cứng đường dẫn tuyệt đối.

Có cách nào để thực hiện việc này mà không sử dụng đường dẫn tuyệt đối đến DLL của tôi mỗi lần không?

Trả lời

1

Tôi nhận ra đây không phải là câu trả lời mà bạn có thể muốn nghe nhưng đây là cách tôi nhận được nó.

Chúng tôi đã tạo tập lệnh PowerShell trên máy chủ đích. Vì vậy, thay vì chạy lệnh của bạn:

installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll ... etc 

Chúng tôi sẽ chạy:

c:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe d:\powershell\installSites.ps1 siteName <NUL 

Các "tên trang web" đã được thông qua tại như một param vào các kịch bản PowerShell. Bên trong kịch bản nó biết trên máy chủ đích mà tệp cần cài đặt, bất kỳ lệnh nào cần chạy, nhóm ứng dụng để tái chế, v.v.

Một lần nữa, không dễ dàng như tìm đường dẫn tương đối nhưng thực hiện công việc.

+1

này có vẻ là một đề nghị nào chính thức, quá: http://social.msdn.microsoft.com/Forums/en/msbuild/thread/1044058c-f762-456b-8a68-b0863027ce47 –

4

Bạn có thể thêm định nghĩa của DeploymentDir đến csproj với hành động mà bạn đã viết ở trên:

<PropertyGroup> 
<DeploymentDir Condition="'$(Configuration)'=='Release' AND '$(DeploymentDir)'==''">Release Deployment Dir</DeploymentDir> 
<DeploymentDir Condition="'$(Configuration)'=='Debug' AND '$(DeploymentDir)'==''">Debug Deployment Dir</DeploymentDir> 
<DeploymentDir Condition="'$(DeploymentDir)'==''">C:\inetpub\wwwroot</DeploymentDir> 
<AplicationName Condition="'$(Configuration)'=='Release' AND '$(AplicationName)'==''">NewTestApp</AplicationName> 
<AplicationName Condition="'$(Configuration)'=='Debug' AND '$(AplicationName)'==''">MyTestApp</AplicationName> 
<ApplicationDeploymentDir Condition="'$(ApplicationDeploymentDir)'==''">$(DeploymentDir)\$(ApplicationName)\bin</ApplicationDeploymentDir> 
</PropertyGroup> 

điều kiện Theese sẽ cho phép để thay đổi mọi thứ từ dòng lệnh để có toàn quyền kiểm soát quá trình xây dựng trong hệ thống xây dựng của bạn hoặc tập lệnh.

MSBuild.exe yourproj.proj /p:Configuration=Release /p:DeploymentDir=D:\package /p:ApplivationName=BestAppForever 

Và bên trong nhiệm vụ của bạn, bạn có thể sử dụng nó

<ItemGroup> 
    <MsDeploySourceManifest Include="runCommand"> 
    <path>installutil $(ApplicationDeploymentDir)\BusinessLayer.dll</path> 
    </MsDeploySourceManifest> 
</ItemGroup> 
+4

Điều đó sẽ chỉ hoạt động cho DeploymentDir được chỉ định tại thời gian xây dựng. Nhưng một khi gói triển khai sẽ được triển khai đến một trang web sản xuất, ai biết thư mục triển khai vật lý sẽ nằm trên máy đích nào. –

Các vấn đề liên quan