MSBuild输出缺失被Typescript编译的JavaScript文件

4
我们在CI服务器上使用MSBuild编译我们的WebApp,但是构建会从构建输出中省略TypeScript生成的JavaScript文件。
我希望输出包含JavaScript而不是TypeScript,但是在预期位置的输出中都没有出现。
如何在不必将所有JavaScript文件都放入解决方案的情况下包含JavaScript文件?TypeScript团队似乎认为这样做不好,但我也不想在解决方案中有所有文件的副本。

嗨@Gent,我想知道你是否让它工作了?如果你仍然有问题,请告诉我。 - Thomas D
@MrMathos,我已经解决了,但是构建服务器上已经安装了TypeScript,所以问题与您的答案中描述的不同。感谢您的时间和帮助。 - Gent
没问题,很高兴你找到了它! - Thomas D
4个回答

7
问题似乎是由于在构建服务器上使用MSBuild而不是“发布”的原因。我添加了一个AfterBuild目标来包含所有JS文件以构建输出为内容。
<Target Name="AfterBuild">
   <ItemGroup>
      <Content Include="**\*.js" />
   </ItemGroup>
</Target>

尽管这并不是理想的方式,但它允许在使用Visual Studio时js文件不会显示在解决方案中,而文件最终会出现在构建输出中。

让我问你一下 - 当你添加这个时,它实际上会将文件放在目标服务器上吗?我处于类似的情况,使用本地发布使整个交易工作正常,但当我通过排队构建在实际的构建服务器上运行相同的.csproj设置时,它没有起作用。 - NullHypothesis
没错,只要将它添加到csproj本身中,它就可以通过Jenkins上的msbuild和Octopus Deploy正常工作。 - Gent
这太奇怪了,为什么我的程序没有将文件复制到目标服务器?它既没有放在_publishedwebsites文件夹中,也没有放在目标服务器上。我基本上只是使用了你上面提供的内容。还有其他需要注意的地方吗? - NullHypothesis
你已经验证了构建后js文件是否存在吗?例如,如果你有“Scripts/SomeLibrary.ts”,你会找到一个“Scripts/SomeLibrary.js”。 - Gent

5

我尝试了网上许多解决方案,包括<Content Include="**\*.js" />,但没有任何作用。我在本地开发环境中使用MSBuild,并且已经安装了TypeScript并将其目标设置为C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\TypeScript

事实证明,我的“旧”MSBuild运行Web应用程序csproj文件的方式已经过时。我之前是这样做的:

MSBuild.exe my.csproj /Target:ResolveReferences;_CopyWebApplication /property:WebProjectOutputDir=myfolder;OutDir=myfolder\bin;Configuration=Debug 

但幸运的是,由于这篇文章,我需要使用UseWPP_CopyWebApplication代替旧版的_CopyWebApplication

MSBuild.exe /t:Rebuild "/p:WebProjectOutputDir=myfolder;OutDir=myfolder\bin;Configuration=Debug;UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False" my.csproj

现在,在不编辑csproj文件的情况下,我的所有TypeScript都已包含!

谢谢!这应该被标记为答案。你链接的答案调查并找到了问题根源,是由于微软在其发布任务目标文件中做出了错误决定。 - Simon Brangwin

0

TypeScript 可能未安装在您的构建服务器上。要安装它,请将 TypeScript 文件夹从 c:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\ 复制到构建服务器上的相同文件夹中(其中 v12 是您的 Visual Studio 版本)。

但是,您的构建服务器上的 Visual Studio 版本可能不同。在我的情况下,我的开发机器上的版本是 v12,而构建服务器使用的是 v11。我通过将以下内容添加到 [WebProjectName].csproj 文件中来发现这一点:

<Target Name="PrintVisualStudioInfo">
    <Message Text="VisualStudioVersion: '$(VisualStudioVersion)'" Importance="High" />
</Target>
<PropertyGroup>
    <CompileDependsOn>
        PrintVisualStudioInfo;
        $(CompileDependsOn)
    </CompileDependsOn>
</PropertyGroup>

请确保您将其放在最后一个 <Import /> 元素之后。现在,当您查看构建服务器上的构建输出时,您应该会在某个地方看到“VisualStudioVersion:xx”。

TypeScript 文件夹复制到构建服务器上正确的版本文件夹中。


0

仅供参考,可能有所帮助。
最近我们遇到了这个问题,并通过添加以下命令到 BAT 文件中修复了它: /p:VisualStudioVersion=12.0

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe FullBuild.proj /p:VisualStudioVersion=12.0 /t:createRelease /p:ReleaseNumber=5.22.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接