没有为Silverlight输出指定Silverlight项目

时间:2012-03-31 07:35:08

标签: silverlight

我有一个非常标准的Silverlight应用程序在ASP.NET主机下运行。在所有开发机器上,它编译得很好,但在我们的CI服务上,我们得到了这个错误:

  

没有为Silverlight输出指定Silverlight项目

但是如果我登录CI并使用VS2010手动编译它可以正常工作!这是Silverlight 4,.NET 4.0

8 个答案:

答案 0 :(得分:9)

由于我花了两天的时间试图弄清楚为什么会在我工作的Silverlight项目中发生这种情况,我想我会在这里发布。

在我的情况下,问题是由于< ProjectReference>之一引起的。在网站上.csproj有一个项目GUID,它与项目的实际GUID不匹配(由于之前发生的代码重组)。

这与silverlight应用程序或其任何设置无关。我不知道为什么,但不知何故,这个错误的引用导致“CopyFilesToFolders”MSBuild任务在“SourceFiles”列表中多次列出相同的文件。这会导致第一组copys成功,然后是一组“No Silverlight project specified”错误。

只需删除错误的项目引用并重新添加它就修复了GUID并解决了构建问题。

确实是一个非常糟糕的错误消息。

答案 1 :(得分:6)

感谢MerickOWA在此发布,我相信它可以为我节省相同的时间。

我创建了一个PowerShell脚本,以便为解决方案中的所有项目查找不匹配的GUID。它可能会为其他人节省更多时间。

要运行它,请将以下代码复制到与解决方案相同的文件夹中的文本文件中,重命名为.ps1,启动Powershell控制台,导航到包含解决方案的文件夹,然后运行脚本。它将列出错误匹配的项目引用(如果有)。

要修复,请在Visual Studio中打开解决方案,然后删除并重新添加不匹配的项目参考。

function validateSolution([string]$slnFileName) {

    "Validating solution: " + $slnFileName

    # Extract all the c# projects from the solution file
    $solutionProjects = 
        Get-Content $slnFileName | Select-String 'Project\(' | ForEach-Object {
            $projectParts = $_ -Split '[,=]' ;
            New-Object PSObject -Property @{
                Kind = $projectParts[0].Replace('Project("', '').Replace('") ','');
                Name = $projectParts[1].Trim('" ');
                File = $projectParts[2].Trim('" ');
                Guid = $projectParts[3].Trim('" ');
            }; 
        } | Where-Object { $_.Kind -eq "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}" } # Kind = C# project

    # Output list of C# projects to console
    # $solutionProjects

    # Create HashTable keyed on project GUID
    $solutionProjectGuids = @{}
    foreach ($project in $solutionProjects) {
        $solutionProjectGuids.Add($project.Guid, $project)
    }

    # Loop through each c# project in the solution
    foreach ($project in $solutionProjects) {
        [xml]$projectXml = Get-Content $project.File
        $projectReferences = $projectXml.Project.ItemGroup | Where-Object { $_.ProjectReference -ne $null }

        # Loop through each ProjectReference
        foreach($reference in $projectReferences.ChildNodes | Where-Object { $_.Project -ne $null } ) {
            # Check the project reference GUID exists in hash table of project GUIDS; if not write error
            if (!$solutionProjectGuids.ContainsKey($reference.Project)) {
                ""
                "Bad ProjectReference: Project GUID not found in solution " 
                "Solution:  " + $slnFileName
                "Project:   " + $project.File
                "Reference: " + $reference.Name
                "Bad GUID:  " + $reference.Project
            }
        }
    }
    "Completed solution:  " + $slnFileName
}

foreach ($solutionFile in ls *.sln) {
    validateSolution $solutionFile
}

答案 2 :(得分:1)

如果您查看构建服务器生成的日志文件,您可能会看到类似这样的内容......

CopySilverlightApplications:
  Copying Silverlight applications
  Copying <Path>.xap to <Path>.xap
MSBUILD : error : Copying file <Path>.xap failed. No Silverlight project specified for Silverlight output <Path>.xap. [<Path>.csproj]

CopySilverlightApplications是在以下文件中定义的目标。

C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ WebApplications \ Microsoft.WebApplication.targets

它包含这个条件,解释了使用Visual Studio构建时没有遇到问题的原因。

Condition="'$(BuildingInsideVisualStudio)' != 'true'"

我有两个构建定义,每个构建定义构建不同的配置。其中一个版本是OK(Release),但另一个(Nightly)有你描述的问题。当我使用XML编辑器查看silverlight应用程序的项目文件时,我看到虽然有一个属性组的条件对于Release来说是真实的 - 但是Nightly没有。

我通过获取Release的属性组的副本来手动编辑文件,并调整条件和OutputPath以适应Nightly版本。 解决了这个问题。

之后我注意到,如果我导航到Visual Studio中Silverlight项目的Properties页面并使用工具栏中的下拉列表交换到Nightly配置,则会自动为该配置生成一个新的PropertyGroup元素。 这可能也会解决问题。

答案 3 :(得分:1)

我遇到了同样的问题。该项目在Debug和Release配置中构建得很好,但我在Web项目中得到了“为Silverlight输出指定了没有Silverlight项目”。我还注意到它试图从./bin/Release/而不是./bin/Production/复制.xap文件。

从Web项目中删除所有Silverlight应用程序(项目属性中的选项卡)并添加ClientBin文件夹作为输出路径(建议here)后,我收到了更好的错误消息。问题是web项目引用的一些项目缺少选定的配置。添加配置后,我可以再次将Silverlight应用程序添加到Web项目,并将输出路径返回到bin / $(Configuration)/并仍构建解决方案。

答案 4 :(得分:0)

我似乎在CopySilverlightApplications任务中生成了导致此错误的重复xap文件名。我可以通过在下面对以下文件进行修改来解决此问题。请注意引入新的ItemGroup以及CopyFilesToFolders任务中的SourceFiles属性对它的引用。

C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ WebApplications \ Microsoft.WebApplication.targets

<ItemGroup>
    <_UniqueSilverlightXapFiles Include="%(_SilverlightXapFiles.FullPath)" />
</ItemGroup>

<!--Copy the outputs to the target folder-->
<CopyFilesToFolders SourceFiles="@(_UniqueSilverlightXapFiles)" 
                    SilverlightApplications="@(_SilverlightApplications)" 
                    ConfigName="$(Configuration)"  
                    Condition="'@(_SilverlightXapFiles)' != ''">
  <Output TaskParameter="DestinationFiles" ItemName="_WebApplicationSilverlightXapFiles" />      
</CopyFilesToFolders>

答案 5 :(得分:0)

为了进一步混淆这个问题,我在我们现有的解决方案中添加了2个新项目(一个新的库及其相关的测试项目),CI构建失败了,no silverlight project specified for silverlight output error已经成功了2天之前。这2个新项目没有其他项目使用的配置。

通过Solution Configuration Manager将缺少的配置添加到2个新项目中。

为什么这会影响与这两个新项目无关的Silverlight项目,我不知道。

答案 6 :(得分:0)

我遇到了同样的问题。我正在制作构建脚本,在解决方案上运行msbuild。 我在"Test"配置中构建解决方案,但引用Silverlight项目的Web项目一直在目标bin\Release文件夹中查找二进制文件。 我尝试重新添加Silverlight项目,问题仍然存在。

原来问题是在msbuild参数中指定Platform。 解决方案配置"Test|AnyCPU""Test|MixedPlatform"不一样。您会发现ConfigurationPlatform必须等于项目文件中定义的同一对。我不知道msbuild默认采用Platform是什么,但我知道它跳转到了Release文件夹。

无论如何,我将/p:Platform="Any CPU"添加到msbuild参数中。

答案 7 :(得分:0)

在仔细查看为CI构建的配置之后,我发现我的Web项目引用的项目之一被设置为使用错误的配置构建。我的CI构建设置为构建暂存(任何CPU),并且我的一个.projects被Web项目引用设置为使用发布配置构建。将配置更新为暂存后,CI构建成功完成